为了账号安全,请及时绑定邮箱和手机立即绑定

方法重载并选择最具体的类型

方法重载并选择最具体的类型

叮当猫咪 2019-08-19 17:10:22
方法重载并选择最具体的类型示例代码是:    public class OverloadingTest {        public static void test(Object obj){            System.out.println("Object called");        }        public static void test(String obj){            System.out.println("String called");        }        public static void main(String[] args){            test(null);            System.out.println("10%2==0 is "+(10%2==0));            test((10%2==0)?null:new Object());            test((10%2==0)?null:null);    }输出是:名为10%2 == 0的 字符串为true 称为String的对象称为第一次调用test(null)带String参数调用方法,这是可以理解的The Java Language Specification。1)任何人都可以解释我test()在前面的电话中调用的基础吗?2)当我们提出时,说一个if条件:    if(10%2==0){         test(null);     }     else     {         test(new Object());     }它总是使用String参数调用方法。编译(10%2)时编译器会计算表达式吗?我想知道表达式是在编译时还是在运行时计算的。谢谢。
查看完整描述

3 回答

?
POPMUISE

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您给出的示例是不同的:您使用两种不同类型的对象调用方法。三元条件运算符始终在编译时评估为一种类型,适合两个术语。


查看完整回答
反对 回复 2019-08-19
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

JLS 15.25:

条件表达式的类型确定如下:

[...]

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

[...]

所以的类型

10 % 2 == 0 ? null : new Object();

是对象。


查看完整回答
反对 回复 2019-08-19
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

test((10%2==0)?null:new Object());

是相同的:

Object o;if(10%2==0)
    o=null;else
    o=new Object();test(o);

由于类型的oIS Object(就像类型(10%2==0)?null:new Object()test(Object)将总是叫。价值o无关紧要。


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 443 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信