向下倾斜例外

时间:2012-07-24 03:48:25

标签: java downcast

我制作了这段代码:

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

我无法找到我的错误所在。 有人可以帮我解决这个问题吗? 谢谢。 :)

3 个答案:

答案 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的发明者预见到了这样的情况,因此使得你无法获取类型的实例并将其转换为其子类之一。

(我会把它放在评论中,但是太多了)