【问题标题】:The method is ambigous - Java方法不明确-Java
【发布时间】:2014-08-03 16:25:35
【问题描述】:

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

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(Integer) 对于 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 的方法。以及模棱两可的类型错误的原因是什么。

【问题讨论】:

  • String 和 Integer 不相关,String 和 Object 相关。这是 JLS 中的某个地方..

标签: java overloading overriding


【解决方案1】:

IntegerString 不在同一个层次结构中。这意味着您不能将String 分配给Integer,反之亦然。

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

15.12 节Method Invocation Expressions 中的Java Language Specification (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);

【讨论】:

  • 或者简而言之,在 Integer 和 String 的情况下,因为任何一种类型都有资格为“null”,因此会导致歧义,但在 Object 和 String 的情况下,歧义是存在的,但 String 可以被标记为“更具体”类型的“对象”,因此根据您提到的 Java 规范,它是被选中执行的。如果我错了,请纠正我!
【解决方案2】:

Null 在 Java 中没有类型。当你调用print(null)时,编译器不知道你是想调用print(String)函数还是print (Integer)函数。

解决方法是显式地转换成你想要调用的类型

print((Integer)null);

print((String)null);

【讨论】:

    【解决方案3】:

    消除方法歧义的一种常见做法是在方法名称中添加类型信息。这样做的好处是让代码清晰明了,而不是使用函数重载来解析调用哪个方法。

    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);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2010-12-21
      • 1970-01-01
      • 2023-03-11
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多