请帮助我理解为什么我不能调用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<?>>
的子类型-BClass
是AClass
的子类,而String
是?
的子类型。但是,在无法编译的调用中,
instGrB.testSuper(instGrA);
您将
Group<AClass<String>>
传递给需要Group<? super BClass<?>>
的方法。这并不匹配,因为尽管AClass
是BClass
的父类(super class),但AClass<String>
并不是BClass<?>
的父类(super class)。此处应归咎于
testExtends
和testSuper
参数内的通配符。因为您要在实例中将AClass
和BClass
分配给T
,所以可以使用它们。如果我们将Group
中的这些方法的声明更改为使用T
,则可以编译该文件:public void testExtends(Group<? extends T> value){}
public void testSuper(Group<? super T> value){}