三元运算符的两个右手表达式是否必须具有兼容的类型?

2022-09-04 19:49:53

我的练习测试书包含了关于三元算子的这个问题:

// What is the output of the following application?
public class Transportation {
    public static String travel(int distance) {
        return(distance < 1000 ? "train" : 10);
    }
    public static void main(String[] args) {
        travel(500);
    }
}

它不编译。给出的解释如下:

三元运算要求两个右侧表达式的数据类型兼容。在此示例中,外部三元运算的第一个右侧表达式的类型为 String,而第二个右侧表达式的类型为 int 类型。由于这些数据类型不兼容,因此代码不会编译,并且选项 C 是正确的答案。

这真的是原因吗?在我看来,这个例子没有编译,因为10不是字符串,而字符串是方法必须返回的内容。我问是因为编译和运行没有问题。System.out.println(distance < 1000 ? "train" : 10);


答案 1

您的方法声明返回类型为 。任何语句都必须生成与声明的返回类型兼容的表达式。Stringreturn

但是,在这种情况下,返回类型可以是 ,这解释了编译器拒绝它的原因。int

这不是特定于三元运算符的,它也可以用等效的/块复制:ifelse

if(distance < 1000)
   return "train"; //This part is valid
else
    return 10; //This line will be rejected by the compiler

出于同样的原因,最后一行将无法编译。这仅仅是因为基本的类型检查。

系统.out.println(距离 < 1000 ?“火车” : 10);编译和运行没有问题。

这是因为编译器检测到 和 的通用类型,即 ,并解析为 选择此签名:StringintObject

java.io.PrintStream#println(Object x) // available in the target class

但是,这不适用于方法返回类型。

如果将返回类型更改为 ,则代码也会编译。但这当然不是你想做的。Object

三元运算要求两个右侧表达式的数据类型兼容

-> 这部分实际上是有效的。这里有一种解释它的方法:两个表达式中的每一个都必须单独兼容:

String value = distance > 1000 ?
                 "train" //this must be compatible with String
                 :
                 10 //this too must be compatible with String (it isn't)

相比之下:

Object value = distance > 1000 ?
                 "train" //this must be compatible with Object (it is)
                 :
                 10 //this too must be compatible with Object (it is)

换句话说,对 的调用类似于上面的最后一个示例,其中预期的类型与两个表达式兼容。System.out.println(distance < 1000 ? "train" : 10)


答案 2

这真的是原因吗?在我看来,这个例子没有编译,因为10不是字符串,而字符串是方法必须返回的内容。

你的推理和作者的答案都是正确的。
我认为,对你的问题的正确答案是他们之间的结合。

1) 三元算子无效

因为

2) 在当前上下文中,您将其分配给的类型 : an 不能分配给 .intString

您可以使用编译器发出的错误消息进行检查。

在这里,您必须考虑:

return(distance < 1000 ? "train" : 10);

作为编译器要评估的两件事:

1) // 产生结果distance < 1000 ? "train" : 10

2) // 根据方法返回类型返回应分配给 String 的结果returns (the produced result);

实际上,编译错误:

运输.java:3:错误:不兼容类型:条件表达式中的错误类型返回(距离<1000 ?“火车” : 10);
整型无法转换为字符串

引用这两个错误:条件表达式中的错误及其原因:int和字符串之间不相容的错误

因此,仅当三元数在编译时有效时,才会发生引用 int 和 String 之间不兼容的编译错误。return

编写一个有效的三元表达式,你可以看到编译器只会发出有关语句的错误信号:return

public static String travel(int distance) {
    return(distance < 1000 ? 15 : 10);
}

错误:不兼容的类型:int 无法转换为字符串