请帮助我理解为什么我不能调用 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){}
关于java - 以 extends 和 super 作为参数的无限通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35141194/