在重载方法使用Java中的空[复制](Using null in overloaded method

2019-07-02 10:32发布

可能重复:
方法重载为NULL参数

下面的代码编译,去罚款。

public class Main
{
    public void temp(Object o)
    {
        System.out.println("The method with the receiving parameter of type Object has been invoked.");
    }

    public void temp(String s)
    {
        System.out.println("The method with the receiving parameter of type String has been invoked.");
    }

    public void temp(int i)
    {
        System.out.println("The method with the receiving parameter of type int has been invoked.");
    }

    public static void main(String[] args)
    {
        Main main=new Main();
        main.temp(null);
    }
}

在该代码中,将被调用的方法是接受类型的参数的一个String

该文档说。

如果不止一个成员方法既方便和适用于方法调用,就必须选择一个提供运行时方法调度描述符。 Java编程语言使用的是选择了最具体方法的规则。

但是,当在该接受原语的参数的代码的方法的一个我不理解int被修改以接受包装类型的参数Integer ,诸如

public void temp(Integer i)
{
    System.out.println("The method with the receiving parameter of type Integer has been invoked.");
}

发出一个编译时错误。

参考温度是不明确的,在methodoverloadingpkg.Main匹配两个方法温度(java.lang.String中)在methodoverloadingpkg.Main和方法临时(java.lang.Integer中)

在这种特定的情况,为什么合法超载与然而似乎不符合其相应的包装类型的情况下的基本数据类型的方法?

Answer 1:

如果你问什么是更专业的“字符串”或“对象”,你会说什么? 显然,“字符串”,对不对?

如果你问:什么是更专业的“字符串”或“整数”? 目前还没有答案,他们是一个对象的两种正交专业化,你怎么可以在它们之间进行选择? 然后,你必须是明确的关于你要哪一个。 例如通过铸造你的空引用:

question.method((String)null)

当您使用基本类型,你没有这样的问题,因为“空”是引用类型,不能用基本类型冲突。 但是,当你使用引用类型“空”可指代字符串或整数(因为空可强制转换为任何引用类型)。

请参阅在其他问题的答案 ,我贴在上面的评论进一步和更深入的细节,并从JLS甚至几报价。



Answer 2:

当你传递null作为参数的重载方法,该方法choosen是最特殊类型的方法,所以在这种情况下: String是choosen而不是最宽容的: Object

Object / String / int的选择是明确的编译器:你会得到String的一个引起int不能null ,因此其对应的方法是没有资格在这种情况下被调用。

但是,如果你改变intInteger ,编译器会被迷惑,因为这两种方法以String是准确Integer的一个(正交层次)。

而编译器不能(不愿?^^)选择随机。



Answer 3:

首先要明白为什么main.temp(null); 解析temp(String s)temp(Object o)我点你在原来的答复的Java方法分派与空参数 。 本质上,文字null的类型是nulltypeObject < String < nulltype 。 所以null接近String那么它是Object

现在, null是接近String ,因为它是Integer ,所以,当你添加test(Integer)变得暧昧



文章来源: Using null in overloaded methods in Java [duplicate]