Java 2具有超类和子类签名 - 尽管子类的类型是子类,但选择超类

时间:2016-07-16 10:32:21

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

我有以下代码:

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的方法,并且从{{1}开始}是b1的一个实例,然后我们将输入Main Main的实现,而不是equals

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

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

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

很乐意解释。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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