2010-11-09 138 views
0

我最近纔回到Java編程中,目前我遇到了一些問題。Java「擴展」對象

我有一定類型的對象:

StandardClass stdClass = (StandardClass)request.getAttribute(ATTR); 

但現在我需要做的對象stdClass的一些可觀測的觀測。
因爲StandardClass沒有實現Observer接口,我不能直接將它作爲觀察者添加。 所以,我想:

ExtendedClass extends StandardClass implements Observer { ... } 

但我一直沒能找到一種方法來投的原始對象到新類。

可能這整個方法是完全錯誤的,我目前無法看到樹木的森林,所以我很感激任何關於如何解決這類問題的意見。

非常感謝您的時間和幫助,我真的很感激它!

乾杯,
托馬斯

+0

Can not y你讓'StandardClass'實現'Observer'? – 2010-11-09 14:42:53

回答

3

你將不能夠對原始對象鑄在ExtendedClass,因爲它是這個類的一個實例。子類的存在並不意味着超類實例可以以某種方式強制進入這些子類。在這種情況下,您的stdClass對象僅是StandardClass的實例,因此無法成功向下轉發。

編輯澄清:當然,存儲在StandardClass變量中的一些對象實際上可能是ExtendedClass對象。我的理解是,你沒有修改存儲在請求中的實際對象,只是創建了一個子類。當你說你不能執行演員時,我推測你的意思是演員在運行時失敗了ClassCastException(某些演員將被編譯器拒絕,因爲他們不能成功,例如Integer永遠不能投射到String,但這不應該是這種情況之一)。如果您創建子類修改了您的應用程序,以便將存儲在請求中的對象創建爲ExtendedClass對象,則應該成功執行投射。

達到你想要做什麼,更清潔的方法是某種wrapper class,其中包含一個StandardClass實例,並實現了Observer方法本身。然後它可以調用StandardClass上適當的方法來響應觀察到的事件。

+0

非常感謝您的意見! 我以前實際上已經使用過包裝類方法,但問題是,StandardClass有一個超時函數,在這種情況下,它將不得不通知包裝類從observable中註銷自己。 – 2010-11-09 15:32:17

1

如果request.getAttribute(ATTR)對象確實是一個Observable,那麼你可以將它轉換爲這樣:

Observable obs = (Observable) request.getAttribute(ATTR); 

編譯器不會讓你從一種類型強制轉換爲不兼容的類型,如果它知道StandardClass不是Observable。或者,您可以簡單地聲明參考文獻爲ExtendedClass

0

你的方法:

request.getAttribute(ATTR); 

應以將其轉換爲一個觀測器的例子來返回ExtendedClass的對象類型:

Observer observer = (Observer) request.getAttribute(ATTR);