当前位置: 首页 > 知识库问答 >
问题:

方法是模棱两可的-Java

侯善
2023-03-14
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);
}
}

但是,当我尝试相同的示例时,通过将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);
}
}

谁能帮助我理解为什么当输出来自其中有字符串的方法时,签名中有对象的方法是必需的。以及类型错误不明确的原因是什么。

共有1个答案

谭翰海
2023-03-14

整数字符串不在同一层次结构中。这意味着您不能将string分配到integer和反向。

但是StringObject不是这样,因为在java中,默认情况下每个类都扩展Object类。

Java语言规范(JLS)第15.12节中的方法调用表达式详细解释了编译器选择正确的方法来调用的过程。

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

此步骤使用方法的名称和参数表达式的类型来定位既可访问又可应用的方法。这种方法可能不止一个,在这种情况下,选择最具体的方法。

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

    public  void print(Number string) {
        System.out.println("String");
    }
}
new Test().print(null);
 类似资料:
  • 无法找出正确的方法来使用匹配器来识别我要处理的exchange方法的重载。我正在打的电话:

  • 问题内容: public class Primitive { void m(Number b, Number … a) {} // widening, autoboxing->widening->varargs 我已经搜索过,发现加宽优先级比拆箱优先,因此在上述方法调用中,应该调用第一个方法,因为两个参数都相同。但这不会发生。你能解释一下吗? 问题答案: 它无法在JDK 1.5、1.6和1.7中进

  • 问题内容: 我想知道Eclipse中的错误消息是什么意思: 构造函数Case(问题,解决方案,double,CaseSource)含糊不清 问题答案: 当您尝试实例化一个可应用于多个构造函数的类时,将存在问题。 例如: 如果用String对象调用构造函数,则有一个确定的构造函数。但是,如果实例化,则它可能适用于任何一个,因此是不明确的。 具有相似签名的方法同样适用。

  • 我有一节简单的课 这将输出为10,没有任何错误!!!我原以为这会给我一个ClassCastException,其中有些错误,比如Integer不能转换为HashMap。 出于好奇和愤怒,我尝试了返回值,如下所示

  • 问题内容: 如果在调用时没有设置信号挂起,则线程将被挂起,直到一个或多个挂起。set定义的信号在调用sigwait()时应已被阻止;否则,行为是不确定的。sigwait()对set中的信号的信号动作的影响未指定。 这真的很模棱两可,和这里有什么区别? 而其对如何进行选择的结论并不能完全清楚: 总之,当需要运行代码以响应异步信号来通知线程时,应使用sigwait()处理该信号。或者,如果实现提供信号

  • 我应该如何编写以下Mockito匹配器,以便调用不会有歧义? 我试图在代码中模拟的实际函数调用是: