Java重载方法和null参数

时间:2018-06-27 15:03:11

标签: java java-8

我有以下两个重载方法:

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方法?

1 个答案:

答案 0 :(得分:2)

类型对于IntegerNumber都是可接受的值,因此两者都是可能的重载。

然后,Java选择最具体的重载。

由于IntegerNumber的子类型,因此更加具体。

请参见15.12.2. Compile-Time Step 2: Determine Method Signature

  

如果在适用性测试的三个阶段之一中确定了几种适用的方法,则按照§15.12.2.5中的规定,选择最具体的方法

在{15.12.2.5中,IntegerNumber的相对特殊性不属于这种相当不透明的规范语言:

  
      
  • m2不是通用的,并且m1和m2可通过严格或松散调用来应用,并且其中m1具有形式参数类型S1,...,Sn和m2具有形式参数类型T1,...,Tn,对于所有i(1≤i≤n,n = k),对于参数ei,Si的类型比Ti更具体。
  •