我有以下两个重载方法:
public static void test(Integer n) {
System.out.println("Integer");
}
public static void test(Number n) {
System.out.println("Number");
}
当我使用null
调用测试方法时,会这样:
public static void main(String[] args) throws Exception {
test(null);
}
我收到:
Integer
您能否解释为什么我收到Integer
而不是编译错误,因为使用null
参数确实并不明显,应该执行哪种test
方法?
答案 0 :(得分:2)
Integer
和Number
都是可接受的值,因此两者都是可能的重载。
然后,Java选择最具体的重载。
由于Integer
是Number
的子类型,因此更加具体。
请参见15.12.2. Compile-Time Step 2: Determine Method Signature:
如果在适用性测试的三个阶段之一中确定了几种适用的方法,则按照§15.12.2.5中的规定,选择最具体的方法。
在{15.12.2.5中,Integer
和Number
的相对特殊性不属于这种相当不透明的规范语言:
- m2不是通用的,并且m1和m2可通过严格或松散调用来应用,并且其中m1具有形式参数类型S1,...,Sn和m2具有形式参数类型T1,...,Tn,对于所有i(1≤i≤n,n = k),对于参数ei,Si的类型比Ti更具体。