有人可以帮我理解为什么无法编译此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
}
}
答案 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>>>