null
是一个引用,仅为null
类型,即null
不是对象类型。
但是,当我运行以下代码片段时,当我将null传递给方法method(null);
时,我很惊讶它调用method(String s)
而不是method(Object o)
。
如果null
本身是由Java定义的类型而不是对象类型,那为什么它会调用method(String s)
而不是method(Object o)
?
public class Test {
public static void main(String[] args) {
method(null);
}
public static void method(Object o) {
System.out.println("Object impl");
}
public static void method(String s) {
System.out.println("String impl");
}
}
修改
我又增加了一个方法:
public static void method(Integer s) {
System.out.println("String impl11");
}
现在编译器提供了错误The method method(Object) is ambiguous for the type Test
。
Integer a = null;
如果它是合法的,那么为什么我会看到编译时异常?
答案 0 :(得分:11)
null
可分配给任何引用类型。当涉及到方法重载时,编译器总是更喜欢具有更具体的参数类型的方法。因此,使用String
参数的方法比使用Object
参数的方法更受欢迎,因为String
是Object
的子类。
另一方面,如果选择在具有不相关参数类型的方法之间 - 例如method(String s)
和method (Integer i)
- 代码将不会通过编译,因为所有选项都不具有优先权在另一方面。