我正在尝试一些示例,并且无法理解以下示例中出现代码错误的原因
public class Test {
public static void print(Integer object){
System.out.println("object");
}
public static void print(String string){
System.out.println("String");
}
public static void main(String... args){
print(null);
}
}
我收到的错误为: 方法print(整数)对于类型Test
是不明确的但是当我通过将Integer更改为Object来尝试相同的示例时,代码编译得很好并且输出为 String
public class Test {
public static void print(Object object){
System.out.println("object");
}
public static void print(String string){
System.out.println("String");
}
public static void main(String... args){
print(null);
}
}
任何人都可以帮助我理解为什么当输出来自其中包含String的方法时,需要在其签名中使用Object的方法。造成类型错误的原因是什么。
答案 0 :(得分:3)
Integer
和String
不在同一层次结构中。这意味着您无法将String
分配到Integer
和反之亦然。
但String
和Object
并非如此,因为在java中,默认情况下每个类都会扩展Object
类。
第15.12节Java Language Specification中的Method Invocation Expressions(JLS)详细解释了编译器选择正确调用方法所遵循的过程。
在那里,您会注意到这是编译时任务。 JLS在第15.12.2小节中说:
此步骤使用方法的名称和参数表达式的类型 找到既可访问又适用的方法 可能存在多个这样的方法,在这种情况下,选择most specific一个。
请参阅Method overloading and choosing the most specific type
请查看以下示例代码,其中Integer
和Number
处于相同的层次结构中,以便它有效。
class Test {
public void print(Integer object) {
System.out.println("object");
}
public void print(Number string) {
System.out.println("String");
}
}
new Test().print(null);
答案 1 :(得分:2)
消除这种方法歧义的常见做法是在方法名称中添加类型信息。这样做的好处是可以使代码显式清晰,而不是使用函数重载来解析调用哪个方法。
public class Test {
public static void printInteger(Integer object){
System.out.println("object");
}
public static void printString(String string){
System.out.println("String");
}
public static void main(String... args){
printInteger(null);
}
}
答案 2 :(得分:1)
Null在Java中没有类型。当您致电print(null)
时,编译器不知道您是要调用print(String)
函数还是print (Integer)
函数。
解决方案是明确地转换为您想要的类型
print((Integer)null);
或
print((String)null);