簡體   English   中英

Java泛型層次結構

[英]Java generics hierarchy

我試圖創建一個類的層次結構,從具有泛型類型的抽象類開始。 然后在第二代子類中使用泛型的擴展類型。 由於我很確定還不清楚,所以下面是一個示例:

這個想法是要有一個項目表,所以基本上是:

我正在嘗試做的簡單UML

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>的超類型,因此TableOfFooTableOfSonOfFoo實際上是層次結構中的同級對象。

寧願將其寫成評論,但還沒有足夠的聲譽。 你有沒有嘗試過:

class TableOfSonOfFoo extends AbstractTableOfItems<SonOfFoo>

在我看來這是合法的,這將是我的第一個猜測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM