3 回答
TA贡献1765条经验 获得超5个赞
Java使用早期绑定。在编译时选择最具体的方法。通过参数数量和参数类型选择最具体的方法。在这种情况下,参数数量无关紧要。这给我们留下了参数类型。
参数有哪些类型?两个参数都是表达式,使用三元条件运算符。问题简化为:条件三元运算符返回什么类型?类型在编译时计算。
给出了两个表达式:
(10%2==0)? null : new Object(); // A(10%2==0)? null : null; // B
此处列出了类型评估规则。在B
很容易,这两个方面是完全一样的:null
将返回(无论何种类型,可能是)(JLS:“如果第二个和第三个操作数具有相同的类型(可能是空型),然后就是类型条件表达式。“)。在A
第二个术语是来自特定的类。由于这是更具体的并且null
可以替换类Object
的对象,整个表达式的类型是Object
(JLS:“如果第二个和第三个操作数之一是null类型而另一个的类型是引用类型,那么条件表达式的类型是引用类型。“)。
在对表达式进行类型评估之后,方法选择符合预期。
if
您给出的示例是不同的:您使用两种不同类型的对象调用方法。三元条件运算符始终在编译时评估为一种类型,适合两个术语。
TA贡献1810条经验 获得超4个赞
JLS 15.25:
条件表达式的类型确定如下:
[...]
如果第二个和第三个操作数之一是null类型而另一个操作数的类型是引用类型,则条件表达式的类型是该引用类型。
[...]
所以的类型
10 % 2 == 0 ? null : new Object();
是对象。
TA贡献1798条经验 获得超7个赞
test((10%2==0)?null:new Object());
是相同的:
Object o;if(10%2==0) o=null;else o=new Object();test(o);
由于类型的o
IS Object
(就像类型(10%2==0)?null:new Object()
)test(Object)
将总是叫。价值o
无关紧要。
添加回答
举报