我有一個通用類A<T>
和一個子類B延伸A<String>
。 A類有一個方法返回這個(所以一個A<T>
)。 問題是,如果我調用B對象上的方法,它將返回一個A<String>
,我必須投射到B,但B與A<String>
相同,不是嗎?所以,我不應該投...Java通用鑄造
Java通用鑄造
回答
如果你的方法返回A<String>
它可以是類型B
的對象,但它並沒有要!
如果您有超類型car
和BMW extends car
。
考慮一家生產汽車的工廠。 該方法返回車輛 - 這可以是寶馬,但它不一定是寶馬。
我重寫了方法並將返回的值進行轉換,以便我不必在任何地方執行它。謝謝@AndyTurner
你甚至沒有演員。您可以覆蓋的方法和改變返回類型爲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();
這是行得通的,但是如果有大量的方法會很快變得站不住腳。 –
你可以這樣做,或者你可以在每次調用方法時施放。 – germanfr
正如我所說的那樣。此解決方案非常簡單,適用於層次結構中有一個或兩個方法以及一個或兩個類的情況。如果有大量返回自我類型的方法,則變得不可維護;如流暢的訪問者或生成器模式。在那種情況下,需要重複出現的模板模式。然而,鑄造絕不是一種選擇。 –
- 1. Java的鑄造通用
- 2. 通用類中的java通用鑄造
- 3. 通用鑄造
- 4. 通用鑄造
- 5. 通用鑄造
- 6. 通用型鑄造
- 7. 通用和鑄造的Java規則
- 8. 鑄造通用陣列中的Java
- 9. 鑄造到java中的通用參數
- 10. 鑄造在Java
- 11. 在Java中的類型鑄造/鑄造
- 12. Java的鑄造和C++的鑄造
- 13. Java鑄造對象
- 14. 在Java中鑄造
- 15. java - 鑄造泛型
- 16. Android Java類鑄造
- 17. Java變量鑄造
- 18. Java鑄造轉換?
- 19. Java鑄造陣列
- 20. Java對象鑄造
- 21. Java - 鑄造一套
- 22. Java鑄造(動態)
- 23. Java類型鑄造
- 24. C#鑄造通用類型
- 25. c#通用接口鑄造
- 26. IValueConverter - 鑄造通用集合
- 27. 鑄造通用接口
- 28. wpf鑄造通用物品
- 29. 通用陣列鑄造
- 30. 在通用類中鑄造
是「保時捷」與每輛'汽車'一樣嗎? – SomeJavaGuy
請顯示您的代碼......聽起來您可以使用協變返回類型。 –
您需要[返回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)。 –