具有超类和子类签名的Java 2函数-选择超类,尽管子类';s类型是子类
我有以下代码:具有超类和子类签名的Java 2函数-选择超类,尽管子类';s类型是子类,java,inheritance,overloading,dynamic-dispatch,method-dispatch,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){
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
但是,在调试时,我看到我使用类型为Object
的参数输入了Main
实现
我看了那两篇文章:-没有解释我的情况,但是在这种情况下,
s
的类型应该是Object
-这个答案,如果是真的,据我所知,支持我的理论
非常乐意解释。这是因为您将
Main
实例分配给对象
变量Object
不包含equals(String)
方法,因此选择了唯一适合equals(Object)
-的方法。将此代码添加到equals(Object other)
方法的开头
if(other instanceof String)
return equals((String)other);
除此之外,我不确定equals方法如何有用,因为您正在执行此操作returnother==newobject()代码>。你可能应该做的是更接近这个.equals(其他)代码>