我在开发过程中注意到了这一点。
为什么Ternary运算符不在方法参数内工作?这里显然是InputStream
或(其他)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))
}
}
答案 0 :(得分:8)
编译器需要决定它应该在main
方法中调用哪个重载方法。方法调用必须放在main
的编译字节码中,而不是在运行时决定。
实际上,即使你知道条件表达式的类型是InputStream
或String
,编译器也会将其类型视为Object
。来自Section 15.25.3 of the Java Language Specification:
如果引用条件表达式出现在赋值上下文或调用上下文中(第5.2节.§5.3),则它是poly表达式。否则,它是一个独立的表达式。
如果多边形引用条件表达式出现在具有目标类型T的特定类型的上下文中,则其第二个和第三个操作数表达式类似地出现在具有目标类型T的相同类型的上下文中。
多边形引用条件表达式的类型与其目标类型相同。
独立引用条件表达式的类型确定如下:
如果第二个和第三个操作数具有相同的类型(可能是null类型),那么这就是条件表达式的类型。
如果第二个和第三个操作数之一的类型是null类型,而另一个操作数的类型是引用类型,则条件表达式的类型是引用类型。
否则,第二个和第三个操作数分别为S1和S2类型。设T1是将拳击转换应用于S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型。条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)的结果。
其中lub(T1, T2)
代表T1
和T2
类型的"Least Upper Bound"。 InputStream
和String
的最小上限类型为Object
。
答案 1 :(得分:6)
表达式useIsr ? inputStream : arg
的类型为Object
,因为这是inputStream
(InputStream
)和arg
(String
)的常见类型。
您没有接受opAlpha
的任何Object
方法。因此编译错误。