[英]Java generics hierarchy
我試圖創建一個類的層次結構,從具有泛型類型的抽象類開始。 然后在第二代子類中使用泛型的擴展類型。 由於我很確定還不清楚,所以下面是一個示例:
這個想法是要有一個項目表,所以基本上是:
abstract class AbstractTableOfItems<T>
->表的通用類型
class Foo
->一種類型的項目
class Bar
->項目的另一種類型
class SonOfFoo extends Foo
class TableOfFoo extends AbstractTableOfItems<Foo>
class TableOfBar extends AbstractTableOfItems<Bar>
到目前為止,一切都很好(讓我們不在乎類的內容,這不是重點)。
但是然后,我想要一個SonOfFoo
表,並希望它擴展TableOfFoo
因為SonOfFoo
繼承自Foo
。 這似乎是不可能的。 也許我在想錯方法,但是我只是不明白為什么。
class TableOfSonOfFoo extends TableOfFoo
可以編譯但是是錯誤的,因為它仍然是Foo
的表,使用的通用類型是Foo
。
class TableOfSonOfFoo extends TableOfFoo<SonOfFoo>
因為通用類型在AbstractTableOfItems
上,所以不會編譯。
好吧,我說,讓我們嘗試重新定義TableOfFoo
,使其可以接受繼承:
class TableOfFoo extends AbstractTableOfItems<? extends Foo>
再次錯誤,“一個超類型可能沒有指定任何通配符”(我不確定我是否完全理解這一點)。
我不能觸摸AbtractTableOfItems
,因為它不會像我想要的那樣通用。 所以我有點卡在這里。 我知道,僅讓TableOfSonOfFoo
直接從AbstractTableOfItems
繼承就可以工作,但是隨后我將失去TableOfFoo
所有實現。
我可以解決這個問題,但是我試圖考慮一個層次結構,並理解為什么這行不通。
這將編譯:
class TableOfFoo<F extends Foo> extends AbstractTableOfItems<F>
就是說:我不喜歡上面的設計。 具有具體類型TableOfFoo和TableOfBar意味着這些類可能做的比預期更多。 也許您想檢查設計,看看是否可以通過使用聚合而不是繼承來簡化設計。
您可以使TableOfFoo
通用,例如
class TableOfItems<T> extends AbstractTableOfItems<T>
並拉出您要共享的所有功能。 然后創建這個的子類:
class TableOfFoo extends TableOfItems<Foo>
class TableOfSonOfFoo extends TableOfItems<SonOfFoo>
請記住, AbstractTableOfItems<Foo>
不是AbstractTableOfItems<SonOfFoo>
的超類型,因此TableOfFoo
和TableOfSonOfFoo
實際上是層次結構中的同級對象。
寧願將其寫成評論,但還沒有足夠的聲譽。 你有沒有嘗試過:
class TableOfSonOfFoo extends AbstractTableOfItems<SonOfFoo>
在我看來這是合法的,這將是我的第一個猜測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.