我需要做类似的事情:
class AbstractA<PARAM extends AbstractB<AbstractA<PARAM>>> {
public AbstractA(PARAM arg) {
arg.doStuff(this);
}
}
class AbstractB<T extends AbstractA<?>> {
public void doStuff(T onWhat) {
System.out.println(onWhat);
}
}
class A extends AbstractA<Foo> {
public A(Foo arg) {
super(arg);
}
}
class Foo extends AbstractB<A> {
}
但是,我在#34时遇到此错误; A类延伸了AbstractA {&#34;:
Bound mismatch: The type Foo is not a valid substitute for the bounded
parameter <PARAM extends AbstractB<AbstractA<PARAM>>> of the
type AbstractA<PARAM>
怎么可能? 当我试图弄清楚泛型时,它看起来是正确的。
答案 0 :(得分:3)
让我们把它画出来。在
class A extends AbstractA<Foo> {
类型参数Foo
应匹配
class AbstractA<PARAM extends AbstractB<AbstractA<PARAM>>> {
^
|
Foo
其中Foo
是
class Foo extends AbstractB<A> {
截至目前,Foo
已延长AbstractB
。让我们看看它的类型参数。
class AbstractB<T extends AbstractA<?>> {
^
|
A
那么A
是什么?它是否与那些界限相匹配
class A extends AbstractA<Foo> {
似乎因为Foo
可以适合通配符。
但是,当Foo
用作类型参数时,需要考虑通配符,因此它看起来像以下继承(和泛型)层次结构
Foo extends AbstractB<A extends AbstractA<?>>
不适合
的大局PARAM extends AbstractB<AbstractA<PARAM>>
所以Foo
不能用作那里的类型参数。