2016-08-16 163 views
0

我有一個通用類A<T>和一個子類B延伸A<String>。 A類有一個方法返回這個(所以一個A<T>)。 問題是,如果我調用B對象上的方法,它將返回一個A<String>,我必須投射到B,但B與A<String>相同,不是嗎?所以,我不應該投...Java通用鑄造

+0

是「保時捷」與每輛'汽車'一樣嗎? – SomeJavaGuy

+1

請顯示您的代碼......聽起來您可以使用協變返回類型。 –

+1

您需要[返回SELF](https://stackoverflow.com/questions/7354740/is-there-a-way-to-refer-to-the-current-type-with-a-type-variable)模式。這有點難看,但有效。這是[好奇地重複出現的模板模式]的示例(https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)。 –

回答

1

如果你的方法返回A<String>可以是類型B的對象,但它並沒有要!

如果您有超類型carBMW extends car

考慮一家生產汽車的工廠。 該方法返回車輛 - 這可以是寶馬,但它不一定是寶馬

+1

因爲我可以創建另一個類,這也延伸A ,我只有一個,所以我沒有看到... – DBLouis

+0

@L.DUPRÉBERTONI這不是一個真正的問題的答案,它有一個很好的解決方案。如果我知道我有一個'B',並且超類中的方法返回'this',那麼我希望它返回一個'B';但該方法實際上會返回一個'A '。解決這個問題的方式是奇怪的循環模板模式。 –

+1

@BoristheSpider這個問題是關於他爲什麼要演員的理解 - 我想我明確地回答了這個問題。如果你發現自己有另外一個問題,可以隨意發佈它作爲他的問題的答案 – Stefan

0

我重寫了方法並將返回的值進行轉換,以便我不必在任何地方執行它。謝謝@AndyTurner

0

你甚至沒有演員。您可以覆蓋的方法和改變返回類型爲B,因爲它仍然是一個A<String>這是一個A<T>,所以它的有效期爲B.

class A<T> { 

    public A<T> return_this() { 
     return this; 
    } 

} 

class B extends A<String> { 

    @Override 
    public B return_this() { 
     return this; 
    } 


} 

所以,你可以這樣做:

B b = new B(); 
A<String> a = b.return_this(); //Because B extends A<String> 
B b = b.return_this(); 
+0

這是行得通的,但是如果有大量的方法會很快變得站不住腳。 –

+0

你可以這樣做,或者你可以在每次調用方法時施放。 – germanfr

+0

正如我所說的那樣。此解決方案非常簡單,適用於層次結構中有一個或兩個方法以及一個或兩個類的情況。如果有大量返回自我類型的方法,則變得不可維護;如流暢的訪問者或生成器模式。在那種情況下,需要重複出現的模板模式。然而,鑄造絕不是一種選擇。 –