7
public class OverloadingTest extends Format{

    public int add(String s1){
        System.out.println("With String");
        return 1;
    }
    public int add(Object a){
        System.out.println("With Object");
        return 1;
    }


    public static void main(String[] args) {
        OverloadingTest overloadingTest = new OverloadingTest();
        overloadingTest.add(null);
    }

}

为什么程序的输出With String ?

我已经尝试阅读 JLS 的第 6 版,但我仍然找不到答案。

我能猜到的唯一原因是选择了继承层次结构中最接近的匹配。

所以在这种情况下,它将 String 因为 Object 是它的超类。

4

3 回答 3

3

此答案可在问题Method Overloading for NULL parameter中找到:

Java 将始终尝试使用可用方法的最具体适用版本(请参阅 JLS §15.12.2)。

因此,String使用了,因为它是可用的最具体的类型。如果存在多个子类型,则必须强制null转换为适当的类型以指定要运行的函数。

于 2013-04-10T05:30:04.340 回答
1

这在§15.12.2.5 中有详细说明。选择最具体的方法

如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。Java 编程语言使用选择最具体方法的规则。

非正式的直觉是,如果第一个方法处理的任何调用可以传递给另一个方法而不会出现编译时类型错误,那么一个方法比另一个方法更具体。

在您的示例中,add(Object)可以处理任何可以处理 的事情add(String)。这使得后者更加具体。因此,它是被选择处理的那个null

于 2013-04-10T05:30:57.623 回答
0

如果多个成员方法既可访问又适用于方法调用... Java 编程语言使用选择最具体方法的规则。

请参阅Java 语言规范

于 2013-04-10T05:47:51.693 回答