三元运算符的右手表达式必须是兼容类型吗?

时间:2018-06-03 18:01:56

标签: java ternary-operator

我的实践测试书包含关于三元运算符的这个问题:

// 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); 编译并运行没有问题。

3 个答案:

答案 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);编译并运行没有问题。

这是因为编译器检测到Stringint的公共类型,即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中所述。