带有extends和super参数的无界通配符

Vas*_*nko 5 java generics

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

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

但testExtends()方法OK.但是,它看起来一样.

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);

    }
}
Run Code Online (Sandbox Code Playgroud)

rge*_*man 3

调用之间存在差异。

在编译的调用中,

instGrA.testExtends(instGrB);
Run Code Online (Sandbox Code Playgroud)

您将 a 传递Group<BClass<String>>给需要 a 的方法Group<? extends AClass<?>>。匹配,因为BClass<String>是 的子类型AClass<?>>--BClass是 的子类AClass,并且String是 的子类型?

但是,在无法编译的调用中,

instGrB.testSuper(instGrA);
Run Code Online (Sandbox Code Playgroud)

您将 a 传递Group<AClass<String>>给需要 a 的方法Group<? super BClass<?>>。这不匹配,因为虽然AClass是 的超类BClass,但AClass<String>不是 的超类型BClass<?>

testExtends和参数中的通配符testSuper是罪魁祸首。因为您正在实例中分配AClassBClassto ,所以您可以使用它们。如果我们将这些方法的声明更改为use T,我可以编译它:GroupT

public void testExtends(Group<? extends T> value){}
public void testSuper(Group<? super T> value){}
Run Code Online (Sandbox Code Playgroud)