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 = ...;


哪个也应该工作。

09-29 21:36