我的实践测试书包含关于三元运算符的这个问题:
// 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不是String,而String是方法必须返回的。
我问是因为
System.out.println(distance < 1000 ? "train" : 10);
编译并运行没有问题。
答案 0 :(得分:14)
您的方法声明返回类型为String
。任何return
语句都必须生成一个与声明的返回类型兼容的表达式。
但是,在这种情况下,返回类型可以是int
,这解释了编译器拒绝它的原因。
这不是特定于三元运算符的,它也可以使用等效的if
/ else
块进行复制:
if(distance < 1000)
return "train"; //This part is valid
else
return 10; //This line will be rejected by the compiler
出于同样的原因,最后一行将无法编译。这只是因为基本的类型检查。
System.out.println(距离<1000?“火车”:10);编译并运行没有问题。
这是因为编译器检测到String
和int
的公共类型,即Object
,并解析为选择此签名:
java.io.PrintStream#println(Object x) // available in the target class
但是,这不适用于方法返回类型。
如果您将返回类型更改为Object
,您的代码也会编译。但那当然不是你想要做的事情。
三元操作要求右手表达式都是兼容的数据类型
- &GT;这部分实际上是有效的。这是解释它的方法:两个表达式中的每个必须单独兼容:
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)
的调用类似于上面的最后一个例子,其中期望的类型与两个表达式兼容。
答案 1 :(得分:5)
真的是这个原因吗?它看起来像这个例子不编译,因为10不是一个字符串,而String是什么方法 必须返回
你的推理和作者的答案都是正确的 我认为你问题的正确答案是它们的结合。
1)三元运算符无效
因为
2)在当前上下文中,您为其指定的类型:int
无法分配给String
。
您可以使用编译器发出的错误消息进行检查。
在这里,您必须考虑:
return(distance < 1000 ? "train" : 10);
作为编译器要评估的两件事:
1)distance < 1000 ? "train" : 10
//产生结果
2)returns (the produced result);
//根据方法返回类型返回应该赋值给String的结果
实际上,编译错误:
Transportation.java:3:错误:不兼容的类型:错误的类型 条件表达式 返回(距离<1000?“火车”:10);
int无法转换为String
指的是两个错误:条件表达式中的错误及其原因: int和String 之间不兼容的错误。
因此,仅当三元组在编译时有效时,才会发生仅在<{1}}中引用 int和String之间不兼容的编译错误。
编写一个有效的三元表达式,您可以看到编译器只会发出有关return
语句的错误信息:
return
错误:不兼容的类型:int无法转换为String
答案 2 :(得分:0)
你是对的,解释很混乱,因为右手表达可以使用不同的兼容类型。
您可以根据第二个和第三个操作数here的类型找到条件表达式的结果类型的表。
可以使用数字类型进行某些类型转换,如this question中所述。