2015-06-20 47 views
5

中的方法参数内工作我在开发中获得了这个注意。为什么三元运算符不能在java

为什么三元运算符不在方法参数内工作?这里显然是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)) 

    } 

} 
+1

这里没有操作员重载。 – EJP

+2

还有我通常的迂腐的评论:它不是三元运算符,它是[*条件运算符*](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls- 15.25)。确实,它是一个**三元操作符(一个接受三个操作数的操作符),它确实是Java中唯一的一个,但理论上在某些时候可能会有其他操作符...... :-) –

+0

Thanks T.J.明白了你的观点! – namalfernandolk

回答

6

表达useIsr ? inputStream : argObject型的,因为这是的inputStreamInputStream)和argString)的常见的类型。

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

+0

@Namalak这意味着它是因为它根据Class类型调用方法。不是对象类型'。我不明白你的意思。如果你的意思是它根据参数的编译时类型而不是运行时类型调用方法,那么你是正确的。编译器在编译时决定调用哪个重载版本的方法。 – Eran

+0

这是真的伊兰。忘记了一段时间重载原则的一般方法。一旦我注意到,我删除了我的评论。删除时我没有注意到您的评论。因为你已经回复了,所以我会尽量让它显示出来。无论如何谢谢你的答案。它清除了我! – namalfernandolk

7

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

事实上,即使你知道条件表达式的类型是InputStreamString,编译器看到它的类型为Object。从Section 15.25.3 of the Java Language Specification

参考条件表达式是聚表达式如果它出现在赋值上下文或调用上下文(§5.2§5.3)。否则,这是一个独立的表达。

凡聚参考条件表达式出现在一个特定种类的靶与类型T的范围内,它的第二和第三操作数的表达式类似地出现在相同的种与目标类型T.

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

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

  • 如果第二和第三个操作数具有相同的类型(其可以是空型),然后就是的类型条件表达式。

  • 如果第二个和第三个操作数中的一个的类型是空类型,而另一个操作数的类型是引用类型,那么条件表达式的类型就是该引用类型。

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

其中lub(T1, T2)代表的类型T1T2"Least Upper Bound"InputStreamString的最小上限类型是Object

+0

谢谢你manouti。你的回答非常丰富,我坚信SOF必须有一个选项来接受多个答案 – namalfernandolk

相关问题