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

Java 2 functions with superclass and subclass signatures - chooses superclass despite that subclass's type is subclass

我有以下代码:

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 的实例,那么我们将输入 Mainequals 实现而不是 Object 的实现。

但是,在调试时我发现我输入了 Main 实现,参数类型为 Object

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

- 这个答案,如果是真的,据我所知支持我的理论。

很乐意提供解释。

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

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

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

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