2010-05-13 21 views
0

嗨,Java向下轉換和is-A有-A關係

我有一個鑄造問題,我在這方面有點生疏。 我有2個clasess這樣的:

class A{ int i; String j ; //Getters and setters} 
class B extends A{ String k; //getter and setter} 

我有一個這樣的方法中,在實用輔助類:

public static A converts(C c){} 

其中C是被從數據庫retireved然後轉換的對象。

的問題是我想通過傳遞「C」和找回B. 調用上面的方法所以,我想這一點:

B bClasss = (B) Utility.converts(c); 

因此,即使上述方法返回AI試圖垂頭喪氣它到B,但我得到一個運行時ClassCastException。 這真的沒有辦法解決嗎?我必須編寫一個單獨的convert()方法來返回一個B類類型嗎?

如果我宣佈我的B類,如:

class B { String k; A a;} // So instead of extending A it has-a A, getter and setters also 

然後我可以叫我現有的方法是這樣的:

b.setA(Utility.converts(c)); 

這樣我可以重用現有的方法,即使extends關係更有意義。我該怎麼辦?任何幫助非常感謝。謝謝。

回答

3

A型演員鍵入B

B bClasss = (B) Utility.converts(c); 

不起作用,因爲A類型的對象不具有所有可能從B類型的引用來調用的方法。如果你打電話

bClasss.getK(); 

下一行怎麼辦?底層對象沒有成員變量k,因此不允許使用此類型轉換。

可以使用更高類型的引用在你的類層次結構指類型的對象,而不是周圍的其他方法。

不知道更多,我認爲做的最好的事情就是實現多種方法

A aObj = Utility.convertToA(c); 
B bObj = Utility.convertToB(c); 

如果B延伸A,那麼你還是應該從你的類的構造函數的一些代碼重用受益。

2

這裏重要的是Utility.converts()實際返回的內容 - 如果它沒有創建一個新的B對象並返回它,那麼就沒有辦法從它得到一個B.

(因爲你得到ClassCastException異常,那麼就不會產生內部B)

+0

謝謝號Yoni,我已經宣佈了以上方法轉換如下: 公共靜態轉換一個(C C){} 所以它的回報A.我想知道有沒有解決這個問題沒有別的辦法,其他而不是將關係從is-a 改爲has-a或者編寫另一種方法? – msharma 2010-05-13 19:16:50

+1

它不是轉換()的聲明的問題,它是轉換()的**實現**的問題(它是做什麼的?) – Justin 2010-05-13 19:28:05

1

你應該在抽象的適當水平的工作,寫你的方法簽名做同樣的。如果B的public/default接口被A修改得很厲害,那麼你的方法簽名確實應該返回一個B。否則,試圖對其進行轉換,將.converts的結果賦值給A類型的變量,然後處理它就像A一樣,即使它是真的類型也是B類型的。如果你試圖在這裏沮喪,那麼你將通過繼承來擊敗抽象點。

沒有看到您的源代碼,我不知道在這裏用組合代替繼承是否合理。以上段落假設你所說的「擴展關係更有意義」是真的。

0

如果你的轉換()方法實際上並不返回一個B,那麼有沒有辦法把它轉換爲B.因爲你得到一個ClassCastException它顯然不返回B.

你當然可以寫一個轉換(C C)返回一個B.但是,另一種方法可能是寫一個構造函數:

B(A a) 

基於A的然後使用轉換來獲取內容創建A B一個C,並從它創建一個B.