我正在尝试创建类的层次结构,从具有泛型类型的抽象类开始。然后在第2代子类中使用扩展类型的泛型。由于我很确定不清楚,以下是一个例子:
这个想法是有一个项目表,所以基本上是:
abstract class AbstractTableOfItems<T>
- &gt;表的通用类型
class Foo
- &gt;一种项目
class Bar
- &gt;项目的另一种类型
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>
再次出错,&#34;超类型可能没有指定任何通配符&#34; (我不确定我完全理解这个)。
我无法触及AbtractTableOfItems
,因为它不会像我想要的那样通用。所以我有点卡在这里。
我理解只有TableOfSonOfFoo
直接从AbstractTableOfItems
继承才有效,但我会失去TableOfFoo
的所有实现。
我可以解决这个问题,但我试图想出一个等级制度,并理解为什么这种做法不会奏效。
答案 0 :(得分:4)
这将编译:
class TableOfFoo<F extends Foo> extends AbstractTableOfItems<F>
那说:我不喜欢上面的设计。具有TableOfFoo和TableOfBar的具体类型意味着这些类可能比它们应该做的更多。也许你想检查你的设计,看看你是否可以通过使用聚合而不是继承来简化事情。
答案 1 :(得分:1)
您可以使TableOfFoo
通用,例如
class TableOfItems<T> extends AbstractTableOfItems<T>
并提取您想要分享的所有功能。然后创建这个的子类:
class TableOfFoo extends TableOfItems<Foo>
class TableOfSonOfFoo extends TableOfItems<SonOfFoo>
请注意AbstractTableOfItems<Foo>
不是AbstractTableOfItems<SonOfFoo>
的超类型,因此TableOfFoo
和TableOfSonOfFoo
实际上是层次结构中的兄弟。
答案 2 :(得分:0)
本来应该把这些写入评论,但还没有足够的声誉。你试过了吗?
class TableOfSonOfFoo extends AbstractTableOfItems<SonOfFoo>
这对我来说似乎是合法的,并且是我的第一个猜测。