我有:
class A
{
public String getID() { return "id of A";}
}
class B extends A
{
public String getID() { return "id of B"; }
}
和
class C {
public A returnA() {
return new A();
}
}
现在我需要做的事情:
C c = new C();
B b = (B)c.returnA();
String id = b.getId();
但我无法访问C.returnA()的实现,我无法将其返回类型更改为B.
解决方法:
您正在将父母投射到孩子身上.
你永远不能那样做,因为新的A()绝对不是B.
考虑一下:String extends Object.现在尝试cast(String)new Object().根本没有任何意义.
因为你的对象无论如何都不是B,所以它不可能有B的行为.
下面是一个Decorator实现的示例:
public class B extends A {
private A decorated;
public B(A decorated) {
this.decorated = decorated;
}
@Override
public String getID() {
return "id of B";
}
@Override
public void otherMethodOfA() {
return decorated.otherMethodOfA();
}
}
请注意,必须覆盖A的所有方法,以确保在装饰元素上调用方法. (这里是otherMethodOfA的一个例子)
使用这样:
C c = new C();
B b = new B(c.returnA());
String id = b.getID();
标签:java,oop
来源: https://codeday.me/bug/20190713/1454080.html