请帮助我理解为什么我不能调用testSuper()方法?有编译错误:

The method testSuper(Group<? super BClass<?>>) in the type Group <BClass<String>> is not applicable for the arguments (Group<AClass<String>>)

但是testExtends()方法可以。但是,它看起来一样。
class AClass<T> {}

class BClass<T> extends AClass<T> {}

class Group<T> {
    T name;
    public void testExtends(Group<? extends AClass<?>> value){}
    public void testSuper(Group<? super BClass<?>> value){}
    public T getName(){return name;}
}

public class GenericTest {

    public static void GenericTestMethod(){

        Group<AClass<String>> instGrA = new Group<AClass<String>>();
        Group<BClass<String>> instGrB = new Group<BClass<String>>();

        //OK
        instGrA.testExtends(instGrB);

        //The method testSuper(Group<? super BClass<?>>) in the type Group <BClass<String>>
        //is not applicable for the arguments (Group<AClass<String>>)
        instGrB.testSuper(instGrA);

    }
}

最佳答案

通话之间有区别。

在编译的电话中,

instGrA.testExtends(instGrB);

您将Group<BClass<String>>传递给需要Group<? extends AClass<?>>的方法。可以匹配,因为BClass<String>AClass<?>>的子类型-BClassAClass的子类,而String?的子类型。

但是,在无法编译的调用中,
instGrB.testSuper(instGrA);

您将Group<AClass<String>>传递给需要Group<? super BClass<?>>的方法。这并不匹配,因为尽管AClassBClass的父类(super class),但AClass<String>并不是BClass<?>的父类(super class)。

此处应归咎于testExtendstestSuper参数内的通配符。因为您要在实例中将AClassBClass分配给T,所以可以使用它们。如果我们将Group中的这些方法的声明更改为使用T,则可以编译该文件:
public void testExtends(Group<? extends T> value){}
public void testSuper(Group<? super T> value){}

10-08 14:57