所以我在编写一些单元测试时遇到了这种情况。它有点是一个深奥的问题,但我不明白为什么这个代码以这种方式运行。这是代码:
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中的任何方法。为什么会这样?如果使用原始类型进行参数化,则行为相同。
答案 0 :(得分:3)
这与JLS 15.12.2中定义的方法解析有关。这发生在编译时,编译器基本上选择了最适用的特定方法。在您的情况下,这两种方法都适用(因为null
可以转换为Class<?>
或Object
),但Class<?>
版本更具体。
适用null
的内容来自JLS 4.1:
特异性在JLS 15.12.2.5中定义。它可能有点压倒性,但基本上可以按照您的预期运行:Class<?>
是一种比Object
更具体的类型(它是Object
的子类型),因此可以实现方法过载更具体。