【问题标题】:How is ambiguity in selecting from overloaded methods resolved in Java?在 Java 中如何解决从重载方法中选择的歧义?
【发布时间】:2010-04-09 14:50:00
【问题描述】:
package org.study.algos;
public class Study {

    public static void main(String[] args) {
       A a = new A();
       a.m1(null);
    }
 }
 class A {
    public void m1(String s) {
       System.out.println("String");
        System.out.println(s);
    }
    public void m1(Object obj) {
       System.out.println("Object");
       System.out.println(obj);
    }
}

这里的输出是

字符串 空

为什么 JVM 将方法解析为带有 String 参数的方法?

提前致谢 J

【问题讨论】:

标签: java


【解决方案1】:

这是一个相当复杂的算法,在JLS 15.12 中有详细说明。但是这里相关的部分是15.12.2,它表示“选择了最具体的部分”。 Object 和 String 重载都是“可访问和适用的”(String 是适用的,因为 null 文字是所有类型的引用),并且 String 更具体。

编辑:更正部分,每个句法。

【讨论】:

  • 我想你想要 15.12.2。 15.11.2 是关于使用 super 关键字访问超类成员的。
  • 我怎样才能调用最不具体的方法??如果我有 foo(Object o);和 foo(String s);。我想调用 foo(Object o)。我该怎么办?
【解决方案2】:

这些方法是“重载的”,而不是“模棱两可的”。

根据Java Language Specification

当调用方法时(第 15.12 节), 实际参数的数量(以及任何 显式类型参数)和 参数的编译时类型 在编译时用于 确定方法的签名 将被调用(§15.12.2)。

§15.12.2 说:

这样的可能不止一个 方法,在这种情况下最 选择特定的

StringObject 更具体,因此虽然null 与两者兼容,但选择了带有String 参数的方法(当参数类型属于类或接口层次结构)。

【讨论】:

    【解决方案3】:

    空值可以设置为任何类型的引用。 您拥有的所有重载方法都在一个继承层次结构 Object

    【讨论】:

      【解决方案4】:

      字符串是对象,对象不是字符串,因此第一个重载比第二个重载更具体。请参阅JLS 15.12.2,如语法所述。

      【讨论】:

        【解决方案5】:

        我问了一个类似的问题。 Jon Skeet 写了一个大答案。

        我的问题的链接:Which overload will get selected for null in Java?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-18
          • 1970-01-01
          • 1970-01-01
          • 2013-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多