如何允许在这个三层层次结构中接受前两层类作为类型?

时间:2018-04-25 02:18:02

标签: java generics inheritance

我认为我的应用程序中的泛型设计过于复杂(我将尝试简化它),但无论我想看看这是否可行。

假设有以下类(这是我的应用程序中的3层层次结构的设计):

abstract class A<T extends A<T>> // LAYER 1
abstract class B<T extends B<T>> extends A<T> // LAYER 2
class C extends B<C> // LAYER 3

第一层(A类)确保位于第二层或第三层的B类和C类扩展了A类,其类型本身(分别为B和C)。

第二层(B类)确保位于第3层的C类使用C类扩展B类,并使用C类扩展A类(因此从两者继承)。

第三层满足前两层的合约。

现在,我有另一个类如下:

class D<T extends A<T>>

我希望T允许ABC。我试过以下三个:

new D<A<?>> or new D<A> // not allowed, A must extend A<A>
new D<B<?>> or new D<B> // not allowed, B must extend A<B> (it extends A<?>)
new D<C> // allowed

我可以对我的设计进行简单的更改,以允许前两个允许吗?

以下是我需要此功能的原因示例:

List<? extends B<?>> list = ...; // a list containing subclasses of B
for (B<?> item : list) {
    D<B<?>> result = new D<B<?>>(item); // not allowed
}

1 个答案:

答案 0 :(得分:0)

我发现了问题(令人惊讶的是,简化不是解决方案)。

我必须从

更改第2层B
abstract class B<T extends B<T>> extends A<T> // LAYER 2

abstract class B<T extends A<T>> extends A<T> // LAYER 2

我实际上并不知道为什么会解决错误。我所做的是从头开始重新整理我的整个层次结构,思考我实施的每一种类型限制。最后,鉴于对我的问题的最后评论,我意识到使用B<T>没有提供超过A<T>的好处。