该方法含糊不清 - Java

时间:2014-08-03 05:39:42

标签: java override overloading function-overriding

我正在尝试一些示例,并且无法理解以下示例中出现代码错误的原因

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的方法。造成类型错误的原因是什么。

3 个答案:

答案 0 :(得分:3)

IntegerString不在同一层次结构中。这意味着您无法将String分配到Integer和反之亦然。

StringObject并非如此,因为在java中,默认情况下每个类都会扩展Object类。

第15.12节Java Language Specification中的Method Invocation Expressions(JLS)详细解释了编译器选择正确调用方法所遵循的过程。

在那里,您会注意到这是编译时任务。 JLS在第15.12.2小节中说:

  

此步骤使用方法的名称和参数表达式的类型   找到既可访问又适用的方法   可能存在多个这样的方法,在这种情况下,选择most specific一个。

详细了解Java overloading rules

请参阅Method overloading and choosing the most specific type


请查看以下示例代码,其中IntegerNumber处于相同的层次结构中,以便它有效。

class Test {
    public  void print(Integer object) {
        System.out.println("object");
    }

    public  void print(Number string) {
        System.out.println("String");
    }
}
new Test().print(null);

enter image description here

答案 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);