在
public class Organic<E> {
void react(E e) {
}
static void main(String[] args) {
Organic<? super Elem2> compound = new Organic<Elem>();
compound.react(new Elem());
}
}
class Elem {}
class Elem2 extends Elem {}
为什么会出现编译错误
类型为Organic的方法react(capture#1-of?super Elem2)不适用于参数(Elem)
?
最佳答案
通过使用super,您可以定义类型参数的下限。您说的是有机对象的实际类型是Elem2类型或其超级类型之一。这样,编译器将为Elem2替换您的react方法的签名,如下所示
void react(Elem2 value) {}
因此,您不能将新的Elem()传递给对象,因为它将需要向下转换。
也就是说,出于相同的原因,您不能执行此操作,因为不能将Number传递给需要Integer的方法。如果您应用向下转换,则问题已解决。
public static void main(String[] args) {
Organic<Object> all = new Organic<Object>();
Organic<? super Elem2> other = all;
Elem a = new Elem2();
other.react((Elem2)a);
}
或者,您可以将其delcare
Organic<? super Elem> other = ...;
哪个也应该工作。