![](/img/trans.png)
[英]Why doesn't polymorphism work in a generics method when using an interface?
[英]Polymorphism doesn't work as expected, why?
我的Java程序中有以下2个类:
public class A {
private final static A five = new A(5);
public final int x;
public A(int x) {
this.x = x;
}
public boolean equals(Object o) {
return x == ((A) o).x;
}
public String toString() {
return equals(five) ? "five" : (x + "");
}
}
public class B extends A {
public final int x;
public B(int x) {
super(x);
this.x = x + 1;
}
public boolean equals(A o) {
return x == o.x;
}
public String toString() {
return "B: " + super.toString();
}
}
现在我主要执行以下两个简单操作:
public static void main(String[] args) {
System.out.println(new A(5));
System.out.println(new B(5));
}
如我所料,大约在第一行,它将创建一个A对象->转到A的toString
函数->为equals
函数获取True
,最后打印“五”。
关于B,我期望的和实际发生的事情是不同的...我认为它将转到B的构造函数->转到A构造函数并将数字5分配给x
>返回B构造函数并将数字6分配给B的x
>转到B的toString
方法并打印“ B:”(直到这一点我是对的)->转到A的toString
>转到B的equals
因为对象类型为B,这就是您在方法激活时所关注的内容( *这是我错的地方->返回False
因为B中的x
是6->因为我们在A的toString
中,所以打印数字5。
相反,在调用A类toString
而不是转到B equals
方法的部分中,它停留在A中并激活A equals
...
我不知道为什么会这样,我所知道的是激活的方法由对象类型决定。
希望有人可以向我解释一下这里有什么不同...谢谢!
为了扩大您的答案,供将来的读者使用:
在A.toString()
您调用this.equals(five)
,其中five
是A
类型。
在A的上下文中,唯一匹配A
equals()
方法是A.equals(Object o)
。 这就是JVM调用的方法。
如果有一个覆盖方法B.equals(Object o)
则将调用此方法。 B.equals()
一个类型更窄的B.equals()
方法是不够的。
您可以通过提供A.equals(A a)
方法或扩展B.equals()
的宽度以采用Object
来获得预期的行为。
一些注意事项:
equals()
使其接受Object
,那么您将覆盖标准方法。 正如给出的注释所解释的那样,我没有重写函数,而是使用对该方法全新的签名重载了该函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.