为什么对象类不取null

Aru*_*run 0 java overloading

我知道原始数据类型的情况下的自动类型提升概念.但是在参考数据类型的情况下,我有下面的代码,它完美地工作.

public class Test4 {

void set(Object o) {
    System.out.println("Inside Object");
}

void set(double[] a) {
    System.out.println("Array");
}
public static void main(String[] args) {
    new Test4().set(null);

}
}
Run Code Online (Sandbox Code Playgroud)

它给出了输出数组.

但是如果代替Object o,如果我们有任何其他类,那么这将显示编译时错误该方法对于类型Test4是不明确的

下面的代码给出了编译时错误

public class Test4 {

/*void set(Object o) {
    System.out.println("Inside Object");
}*/

void set(String s) {
    System.out.println("String");
}
void set(double[] a) {
    System.out.println("Array");
}
public static void main(String[] args) {
    new Test4().set(null);

}

}
Run Code Online (Sandbox Code Playgroud)

据我所知,每个参考数据类型(类,接口和数组)的默认值为null.

那么为什么上面的代码适用于Object o.

提前致谢

Roh*_*ain 7

编译器总是选择具有更具体参数类型的方法,该方法可以匹配传递的参数,以防该参数可用于两个参数.

因为,null是有效值String,Object,double[],所以编译器必须决定调用哪个方法.

  • 在的情况下Objectdouble[],由于double[]是比更具体的Object(阵列只不过是Object).所以编译器会在这里选择更具体的类型 - double[].
  • 在的情况下,Stringdouble[],编译器不能决定哪一个是更具体的类型,因为没有数组和字符串类型(它们不属于同一继承层次)之间的任何关系.所以它使得呼叫变得含糊不清.

您可以通过JLS§15.12.2.5 - 选择最具体的方法