我有以下代码:
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
的方法应该选择,并且因为 b1
是 Main
的一个实例然后我们将输入我们的Main
实现equals
而不是Object
的。
但是,在调试时我看到我输入了 Main
使用 Object
类型的参数实现.
我看过那两篇文章:
Overloaded method selection based on the parameter's real type - 没有解释我的情况,而是解释 s
类型的情况本来就是对象。
https://stackoverflow.com/a/8356435/4345843 - 据我所知,这个答案如果属实,则支持我的理论。
很乐意提供解释。
最佳答案
这是因为您将 Main
实例分配给 Object
变量。 Object
不包含 equals(String)
方法,因此选择唯一适合的方法 - equals(Object)
。
关于具有父类(super class)和子类签名的 Java 2 函数 - 尽 pipe 类的类型是子类,但仍选择父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38410226/