为什么Ternary运算符不在java中的方法参数内工作

我在开发过程中注意到了这一点。

为什么Ternary运算符不在方法参数内工作? 这里显然是InputStream或(else) String

 class A{ public static boolean opAlpha(InputStream inputStream) { // Do something return true; } public static boolean opAlpha(String arg) { // Do something else return true; } public static void main(String[] args) throws Exception { boolean useIsr = true; InputStream inputStream = null; String arg = null; // boolean isTrue = useIsr ? A.opAlpha(inputStream): A.opAlpha(arg); // This is OK. boolean isTrue = A.opAlpha(useIsr ? inputStream : arg); // This is not. (Error : The method opAlpha(InputStream) in the type A is not applicable for the arguments (Object)) } } 

表达用useIsr ? inputStream : arg useIsr ? inputStream : arg的类型为Object ,因为它是inputStreamInputStream )和argString )的常见类型。

您没有任何接受Object opAlpha方法。 因此编译错误。

编译器需要决定它应该在main方法中调用哪个重载方法。 方法调用必须放在main的编译字节码中,而不是在运行时决定。

实际上,即使知道条件表达式的类型是InputStreamString ,编译器也会将其类型视为Object 。 从Java语言规范的第15.25.3节 :

如果引用条件表达式出现在赋值上下文或调用上下文中(第5.2节.§5.3),则它是poly表达式。 否则,它是一个独立的表达式。

当poly引用条件表达式出现在具有目标类型T的特定类型的上下文中时,其第二和第三操作数表达式类似地出现在具有目标类型T的相同类型的上下文中。

多参考条件表达式的类型与其目标类型相同。

独立引用条件表达式的类型确定如下:

  • 如果第二个和第三个操作数具有相同的类型(可以是null类型),那么这就是条件表达式的类型。

  • 如果第二个和第三个操作数之一的类型是null类型,并且另一个操作数的类型是引用类型,则条件表达式的类型是该引用类型。

  • 否则,第二和第三操作数分别是S1和S2类型。 设T1是将拳击转换应用到S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型。 条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)的结果

其中lub(T1, T2)代表T1T2类型的“最小上限” 。 InputStreamString的最小上限类型是Object