我制作了这段代码:
protected Lala lala;
private Oyeha oyeha;
public void setLala(Lala lala) {
this.lala = lala;
}
this.oyeha = (Oyeha) this.lala;
executeHostBean = this.oyeha.updateMethod(a, b, c, d, e);
Lala是parrent类。
Oyeha是拉拉的孩子。
但是当我运行此代码时,我收到了错误:
java.lang.ClassCastException:$ Proxy201
我无法找到我的错误所在。 有人可以帮我解决这个问题吗? 谢谢。 :)
答案 0 :(得分:0)
你的问题可能是this.lala
被设置为Lala的一个实例,而不是 Oyeha的一个实例。由于Oyeha是Lala的子类,因此可以使用Oyeha实例的参数调用public void setLala
,如下所示:
Lala childInstance = new Oyeha();
setLala(childInstance);
但是也可以使用只是Lala实例的参数调用该方法,如下所示:
Lala parentInstance = new Lala();
setLala(parentInstance);
在第一种情况下,this.lala
是一个Oyeha,所以你可以把它投到Oyeha。但在后一种情况下,this.lala
只是一个拉拉,而你向Oyeha this.lala
的演员阵容将会失败,因为拉拉不是奥耶哈。
答案 1 :(得分:0)
如果你有类似Spring注入Lala对象的东西,它可能会创建一个动态代理对象(这就是错误信息所暗示的)。
如果您的设计中绝对需要向下转换,您可能需要重新考虑设计。
答案 2 :(得分:0)
作为其他答案的补充(他们已经基本上已经钉了它):
假设您可以向下转发,那么行this.oyeha = (Oyeha) this.lala
工作,Oyeha有一些领域,比如,test
。
如果您尝试在某处使用this.oyeha.test
,那么它如何知道test
的位置?更糟糕的是,如果Oyeha
的实例占用更多的内存,并且它随意选择一个地址而不是Lala
的实例,该怎么办?
我认为Java的发明者预见到了这样的情况,因此使得你无法获取类型的实例并将其转换为其子类之一。
(我会把它放在评论中,但是太多了)