我认为我的应用程序中的泛型设计过于复杂(我将尝试简化它),但无论我想看看这是否可行。
假设有以下类(这是我的应用程序中的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
允许A
,B
或C
。我试过以下三个:
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
}
答案 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>
的好处。