2012-07-24 42 views
0

我做了這個代碼:向下轉換異常

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); 

拉拉是parrent類。

Oyeha是延伸拉拉的孩子。

但是當我運行這段代碼,我得到錯誤:

java.lang.ClassCastException: $Proxy201

我找不到在哪裏我的錯誤是。 有人可以幫我解決這個問題嗎? 謝謝。 :)

+0

你可以發佈類? – Jared 2012-07-24 03:50:40

回答

0

您的問題可能是this.lala設置爲拉拉的實例,這是而不是 Oyeha的一個實例。由於Oyeha是拉拉的子類,它可以調用public void setLala與是Oyeha的實例參數,如:

Lala childInstance = new Oyeha(); 
setLala(childInstance); 

,但它也可以調用該方法與僅僅是一個實例參數拉拉,這樣的:

Lala parentInstance = new Lala(); 
setLala(parentInstance); 

在第一種情況下,this.lala是Oyeha,這樣你就可以將其轉換爲Oyeha。但在後一種情況下,this.lala只是一個拉拉,而你向伊耶的陣容this.lala將失敗,因爲拉拉不是一個奧耶哈。

0

如果你有類似Spring注入Lala對象的東西,它可能會創建一個動態代理對象(這就是錯誤消息的建議)。

如果在您的設計中向下轉換是絕對必要的,您可能需要重新考慮設計。

0

作爲除了其他答案(他們已經基本上釘它的話):

假設你垂頭喪氣的樣子,這樣訂單this.oyeha = (Oyeha) this.lala 工作,並有在Oyeha一些領域,說,test

如果您隨後嘗試在某處使用this.oyeha.test,它將如何知道test是哪裏?更糟糕的是,如果Oyeha的實例佔用更多的內存,並且它會爲Lala的實例任意選擇一個地址以外的地址?

我想象Java的發明者預見到了這樣的情況,並因此使得你不能接受一個類型的實例並將其拋棄到它的一個子類中。

(我會把這個評論,但太多了)