【问题标题】:Java 2 functions with superclass and subclass signatures - chooses superclass despite that subclass's type is subclass [duplicate]具有超类和子类签名的 Java 2 函数 - 尽管子类的类型是子类,但仍选择超类 [重复]
【发布时间】:2016-11-19 11:56:00
【问题描述】:

我有以下代码:

public class Main {

    public boolean equals(String other){
        return other == new Object();
    }

    public boolean equals(Object other){
        return other == new Object();
    }

    public static void main(String[] args){
        String s = "";
        Object b1 = new Main();
        System.out.println(b1.equals(s));

    }

}

据我所知,equals 方法选择应该这样工作: 在编译期间将选择签名,并且由于s 是编译时类型(例如type),因此应选择带有参数String 的方法,并且由于b1Main 的一个实例然后我们将输入我们的Main 实现equals 而不是Object's。

但是,在调试时,我看到我使用 Object 类型的参数输入了 Main 实现。

我看到了那 2 篇文章:
Overloaded method selection based on the parameter's real type - 没有解释我的情况,而是s 的类型应该是 Object 的情况。

https://stackoverflow.com/a/8356435/4345843 - 据我所知,这个答案如果属实,支持我的理论。

很高兴得到解释。

【问题讨论】:

    标签: java inheritance overloading dynamic-dispatch method-dispatch


    【解决方案1】:

    这是因为您将 Main 实例分配给了 Object 变量。 Object 不包含 equals(String) 方法,因此选择了唯一适合的方法 - equals(Object)

    【讨论】:

      【解决方案2】:

      将此代码添加到equals(Object other) 方法的开头

      if(other instanceof String)
      return equals((String)other);
      

      除此之外,我不确定 equals 方法如何有用,因为您正在这样做return other == new Object();。你可能应该做的是更接近this.equals(other);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多