将null传递给Ambigious重载方法

时间:2016-08-28 07:47:15

标签: java overloading

以下方法将调用哪种重载方法,为什么

我执行了这段代码并用List调用了重载方法,但为什么会这样?

public class AmbigiousOverload {

    public static void add(Object o) {
        System.out.println("Overloaded method with Object.");
    }

    public static void add(List l) {
        System.out.println("Overloaded method with List.");
    }

    public static void main(String[] args) {
        add(null);
    }

}

输出:Overloaded method with List.

1 个答案:

答案 0 :(得分:1)

调用List重载是因为List重载是最具体的匹配重载,因为所有List实现都是Object的子类。

来自JLS Sec 15.12.2.5

  

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时错误的调用,那么一个方法比另一个方法更具体。

由于您传递给add(List)的任何参数也可以传递给add(Object),因此add(List)更具体。因此,鉴于null可以传递给两者,更具体的方法是选择的方法。

请注意,如果您有add(String)重载,则无法编译,因为ListString具有“同等”特定性。 (或任何其他类:它不必是String)。