Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解超级通配符在Java泛型中的作用_Java_Generics_Extends_Super - Fatal编程技术网

试图理解超级通配符在Java泛型中的作用

试图理解超级通配符在Java泛型中的作用,java,generics,extends,super,Java,Generics,Extends,Super,我阅读这篇文章是为了理解super通配符在泛型中的作用。我了解扩展的工作原理,但我很难理解超级 我有一个ClassA,由ClassB扩展而成,使ClassA成为ClassB的超级类 如果我正确理解了这篇文章,和?super子句是一个下限通配符。但是绑定是在推断的类型参数上,而不是对可以传递给接受该泛型类型参数的方法的参数类型的限制 当您通过声明genericmethod说时,请详细说明编译器必须拒绝将ClassA作为要添加的参数是什么意思,因为类型参数可以推断为ClassB?如果类中的方法只接受

我阅读这篇文章是为了理解
super
通配符在泛型中的作用。我了解
扩展
的工作原理,但我很难理解
超级

我有一个
ClassA
,由
ClassB
扩展而成,使
ClassA
成为
ClassB
的超级类


如果我正确理解了这篇文章,
?super
子句是一个下限通配符。但是绑定是在推断的类型参数上,而不是对可以传递给接受该泛型类型参数的方法的参数类型的限制


当您通过声明
genericmethod说
时,请详细说明编译器必须拒绝将ClassA作为要添加的参数是什么意思,因为类型参数可以推断为ClassB?如果类中的方法只接受那些下限类或其子类型的。请参阅。将类型化参数作为泛型类型参数的方法,泛型类型参数又由
定义?super
保证能够接受键入为下限或下限的参数。这里,
add
方法只保证能够接受类型为
ClassB
或更低的参数,而不管实际的类型参数是什么。
public class GenericMethod<T> {

    private List<T> list;

    public GenericMethod() {
        list = new ArrayList<>();
    }

    public void add(T t) {
        list.add(t);
    }

    public T get(int index) {
        return list.get(index);
    }
}
public class Driver {

    public static void main(String[] args) {

        GenericMethod<? super ClassB> genericMethod = new GenericMethod<>();

        ClassA classA = new ClassA();
        genericMethod.add(classA); // Compile-time error here

    }

}
add(Object t)
add(ClassA t)
add(ClassB t)
GenericMethod<? super ClassB> genericMethod = new GenericMethod<ClassB>();