为什么null会解析为Class <! - ? - >重载?

时间:2014-05-20 19:42:46

标签: java null overloading

所以我在编写一些单元测试时遇到了这种情况。它有点是一个深奥的问题,但我不明白为什么这个代码以这种方式运行。这是代码:

public class Test {
    public static void main(String[] args) {
        doSomething(null);
    }

    public static void doSomething(Class<?> c) {
        System.out.println("Parameterized with Class<?>");
    }

    public static void doSomething(Object o) {
        System.out.println("Parameterized with Obejct");
    }
}

在上面的示例中,对doSomething的调用将解析为使用Class参数化的方法,但null不包含Class中的任何方法。为什么会这样?如果使用原始类型进行参数化,则行为相同。

1 个答案:

答案 0 :(得分:3)

这与JLS 15.12.2中定义的方法解析有关。这发生在编译时,编译器基本上选择了最适用的特定方法。在您的情况下,这两种方法都适用(因为null可以转换为Class<?>Object),但Class<?>版本更具体。

适用null的内容来自JLS 4.1

  

始终可以将空引用分配或转换为任何引用类型(§5.2§5.3§5.5)。

特异性在JLS 15.12.2.5中定义。它可能有点压倒性,但基本上可以按照您的预期运行:Class<?>是一种比Object更具体的类型(它是Object的子类型),因此可以实现方法过载更具体。