java - 以 extends 和 super 作为参数的无限通配符

标签 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() 方法可以。但是,它看起来是一样的。

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<?>> 的子类型-- BClassAClass 的子类, 和 String? 的子类型.

但是,在未编译的调用中,

instGrB.testSuper(instGrA);

你传递了一个 Group<AClass<String>>一个期待 Group<? super BClass<?>> 的方法.那不匹配,因为虽然 AClassBClass 的父类(super class), AClass<String>不是 BClass<?> 的父类(super class)型.

testExtends 参数中的通配符和 testSuper是这里的罪魁祸首。因为您要分配 AClassBClassT在您的实例中,您可以使用它们。如果我们在 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/

相关文章:

java - 当程序编译并执行到一半时,然后显示错误,如何调试错误 java.lang.NullPointerException?

java - JBuilder 2006 多种编码

java - 超过 110 字节的大字符串的 SealedObject 大小错误

spring - 嵌套具体化参数无法创建 ParameterizedTypeReference

SwiftUI TupleView 和泛型,如何递归解析某些 View 和 Group 的元组

Swift 闭包泛型参数

java - DeflatorInputStream 和 DeflatorOutputStream 不重构原始数据

c# - 混淆泛型和 Entity Framework

java - Java抽象方法中使用通配符和声明泛型的区别

java - “Cannot find symbol”或 “Cannot resolve symbol”错误是什么意思?