【问题标题】:Why this behavior in overloading [duplicate]为什么在重载时出现这种行为[重复]
【发布时间】:2013-04-24 15:57:59
【问题描述】:

当我运行这个程序时,为什么它会调用带有字符串参数的重载方法。

public class StaticBindTest {

    public static void main(String args[])  {
       StaticBindTest et = new StaticBindTest();
       et.sort(null);

    }

    //overloaded method
    public void sort(Object c){
        System.out.println("Inside Collection sort method");
    }


   //another overloaded method
    public void sort(String hs){
        System.out.println("Inside HashSet sort method");
    }

}

如果我将我的方法重写为

    public void sort(String hs){
        if(hs instanceof String)
        System.out.println("Inside HashSet sort method");
    }

它会显示空白控制台,这意味着它不是String的实例那么为什么它会以这种方式调用?

【问题讨论】:

标签: java


【解决方案1】:

是因为在方法重载的情况下

The most specific method is choosen at compile time.

因为“java.lang.String”是比“java.lang.Object”更具体的类型。在您的情况下,选择了将“String”作为参数的方法。

DOCS中明确提到

【讨论】:

  • 如果我声明另一个整数类型的重载方法,它只会在编译时给我带来歧义错误。为什么会这样。
  • @HyperLink 因为它不明确哪个是“最具体的”。目前,StringObject 的子类,因此在两者中它显然更具体。但是,如果您将Integer 添加到组合中,它是否比String 更具体?他们不在同一个层次结构中,所以不可能说。因此 Java 无法确定哪个是最具体的方法。
  • 我怎样才能调用最不具体的方法??
【解决方案2】:

当我执行你的代码时,我发现Inside HashSet sort method 在输出中。 null 是对对象的空引用。这两种方法都将 Object 作为输入,这就是为什么调用具有更窄层次结构String 的方法的原因。
不要写StaticBindTest et = new StaticBindTest();
只需调用sort(null) 没有对象et

【讨论】:

    【解决方案3】:

    section 15.12.2 of the JLS 中解释了完整的方法,特别是 15.12.2.5(选择最具体的)。

    总结是Java总是选择最具体的适用的重载。由于null 可以是任何类的实例,因此这两种方法都是候选方法。而且由于StringObject 的子类,它肯定更具体。因此调用了 String 重载。

    至于你的最后一段,null 不是instanceof 任何东西。如果您以类似的方式编写了 Object-overload 方法,它不会打印任何内容 - 所以这不是 Java 是否应该选择一个重载或另一个的有力证据。

    【讨论】:

    • 如果我声明另一个整数类型的重载方法,它只会在编译时给我带来歧义错误。为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多