绑定不匹配:类型Foo不是有效的替代

时间:2014-04-18 18:06:59

标签: java generics

我需要做类似的事情:

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>

怎么可能? 当我试图弄清楚泛型时,它看起来是正确的。

1 个答案:

答案 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不能用作那里的类型参数。