Java泛型层次结构

时间:2016-05-31 07:25:19

标签: java generics inheritance

我正在尝试创建类的层次结构,从具有泛型类型的抽象类开始。然后在第2代子类中使用扩展类型的泛型。由于我很确定不清楚,以下是一个例子:

这个想法是有一个项目表,所以基本上是:

Simple UML of what I'm trying to do

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的所有实现。

我可以解决这个问题,但我试图想出一个等级制度,并理解为什么这种做法不会奏效。

3 个答案:

答案 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>的超类型,因此TableOfFooTableOfSonOfFoo实际上是层次结构中的兄弟。

答案 2 :(得分:0)

本来应该把这些写入评论,但还没有足够的声誉。你试过了吗?

class TableOfSonOfFoo extends AbstractTableOfItems<SonOfFoo>

这对我来说似乎是合法的,并且是我的第一个猜测。