为什么对象类不取null

时间:2013-07-29 18:30:13

标签: 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);

}
}

给出输出数组。

但是如果代替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);

}

}

我知道每个参考数据类型(Class,Interface和Array)的默认值都为null。

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

提前致谢

3 个答案:

答案 0 :(得分:7)

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

因为nullStringObjectdouble[]的有效值,所以编译器必须决定调用哪个方法。

  • 如果是Objectdouble[],则double[]Object更具体(数组只是Object)。因此编译器将在此处选择更具体的类型 - double[]
  • Stringdouble[]的情况下,编译器无法确定哪一个是更具体的类型,因为数组和字符串类型之间没有任何关系(它们不属于同一类型)继承层次结构)。所以它使得呼叫变得模棱两可。

您可以浏览JLS §15.12.2.5 - Choosing the Most Specific Method

答案 1 :(得分:0)

因为double[]更具体。

double[]Object。因此,当您致电set(some-double-array)时,会调用此版本。请注意,null很好double[]

但在第二种情况下,没有更具体的方法。

答案 2 :(得分:-3)

因为,Object不是数据类型,每当用户输入一些数据时,它就会决定其数据类型。例如, Object obj = null; //语法错误

对象obj = 4.0; //这里obj是double,因为传递的值是4.0

Object obj =“raj”; //这里obj是字符串。

对象与javascript中的var相同。