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

时间:2016-02-01 21:59:49

标签: java generics

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

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

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

    }
}

1 个答案:

答案 0 :(得分:3)

电话之间存在差异。

在编译的电话中,

instGrA.testExtends(instGrB);

您将Group<BClass<String>>传递给期望Group<? extends AClass<?>>的方法。匹配,因为BClass<String>AClass<?>>的子类型 - BClassAClass的子类,String?的子类型

然而,在没有编译的电话中,

instGrB.testSuper(instGrA);

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

testExtendstestSuper参数中的通配符应该归咎于此。由于您在实例中将AClassBClass分配给T,因此您可以使用它们。如果我们在Group中更改这些方法的声明以使用T,我可以编译这个:

public void testExtends(Group<? extends T> value){}
public void testSuper(Group<? super T> value){}