请帮我解释为什么我无法调用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);
}
}
答案 0 :(得分:3)
电话之间存在差异。
在编译的电话中,
instGrA.testExtends(instGrB);
您将Group<BClass<String>>
传递给期望Group<? extends AClass<?>>
的方法。匹配,因为BClass<String>
是AClass<?>>
的子类型 - BClass
是AClass
的子类,String
是?
的子类型
然而,在没有编译的电话中,
instGrB.testSuper(instGrA);
您将Group<AClass<String>>
传递给期望Group<? super BClass<?>>
的方法。这并不匹配,因为虽然AClass
是BClass
的超类,但AClass<String>
不是BClass<?>
的超类型。
testExtends
和testSuper
参数中的通配符应该归咎于此。由于您在实例中将AClass
和BClass
分配给T
,因此您可以使用它们。如果我们在Group
中更改这些方法的声明以使用T
,我可以编译这个:
public void testExtends(Group<? extends T> value){}
public void testSuper(Group<? super T> value){}