我知道原始数据类型的情况下的自动类型提升概念。但是在参考数据类型的情况下,我有下面的代码,它可以很好地工作。
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。
提前致谢
答案 0 :(得分:7)
编译器总是选择具有更具体参数类型的方法,该方法可以匹配传递的参数,以防该参数可以用于这两个参数。
因为null
是String
,Object
,double[]
的有效值,所以编译器必须决定调用哪个方法。
Object
和double[]
,则double[]
比Object
更具体(数组只是Object
)。因此编译器将在此处选择更具体的类型 - double[]
。String
和double[]
的情况下,编译器无法确定哪一个是更具体的类型,因为数组和字符串类型之间没有任何关系(它们不属于同一类型)继承层次结构)。所以它使得呼叫变得模棱两可。答案 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相同。