【发布时间】:2016-05-31 07:25:19
【问题描述】:
我正在尝试创建类的层次结构,从具有泛型类型的抽象类开始。然后在第二代子类中使用泛型的扩展类型。既然我很确定这还不清楚,这里有一个例子:
这个想法是有一个项目表,所以基本上:
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 的所有实现。
我可以解决这个问题,但我正在尝试考虑层次结构,并理解为什么这不起作用。
【问题讨论】:
标签: java generics inheritance