通用Java类的扩展无法识别超级构造函数

时间:2019-02-26 18:04:21

标签: java generics

有人可以帮我理解为什么无法编译此Java代码吗?

这个想法是A是类型T的树状类,在构造时会吸收大量孩子。

然后,我定义了B的扩展名A,其中T专用于Pair<R,R>

class A<T> {
    A(T t, Collection<? extends A<? extends T>> cOfAs) {

    }
}

class B<R> extends A<Pair<R,R>> { // Pair is just a POJO class
    B(Pair<R,R> pair, Collection<? extends B<? extends R>> cOfBs) {
        super(pair, cOfBs);
        // ERROR: The constructor A<Pair<R,R>>(Pair<R,R>, Collection<capture#1-of ? extends B<? extends R>>) is undefined
    }
}

2 个答案:

答案 0 :(得分:2)

第二个参数的类型不匹配。 B构造函数使用Collection<? extends B<? extends R>>,但是超类构造函数使用Collection<? extends A<? extends T>>

您在T类中将Pair<R, R>定义为B,因此,使用R代替Pair<R, R>。另外? extends部分必须匹配,因此将? extends B<...>更改为? extends A<...>。 B的构造函数的签名现在看起来像这样:

B(Pair<R,R> pair, Collection<? extends A<? extends Pair<R, R>>> cOfBs)

它必须精确地为? extends A,因为? extends B可能与? extends A不匹配。使其匹配的唯一方法是在A中引入另一个表示“自我”类型的类型参数,并在构造函数的第二个参数中使用它。

class A<T, S extends A<T, S>> {
    A(T t, Collection<? extends S> cOfAs) {

    }
}

然后在B中,将B<R>作为“自身”提供。

class B<R> extends A<Pair<R,R>, B<R>> { // Pair is just a POJO class
    B(Pair<R,R> pair, Collection<? extends B<R>> cOfBs) {
        super(pair, cOfBs);
    }
}

答案 1 :(得分:1)

构造函数的第二个参数类型错误:

HttpListenerBahvior

要解决此问题,请将第二个参数更改为Error:(20, 25) java: incompatible types: java.util.Collection<capture#1 of ? extends Main.B<? extends R>> cannot be converted to java.util.Collection<? extends Main.A<? extends javafx.util.Pair<R,R>>>