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
的方法,并且由于 b1
是 Main
的实例,那么我们将输入 Main
的 equals
实现而不是 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);
我有以下代码:
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
的类型本来是 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);