【发布时间】:2019-10-16 19:49:36
【问题描述】:
我正在通过this 文章了解super 通配符在泛型中的作用。我了解extends 的工作原理,但我很难理解super
我有一个由ClassB扩展的ClassA,使ClassA 成为ClassB 的超类。
如果我正确理解了这篇文章,<? super ClassB> 将允许任何属于 ClassB 超类型的类。
我有以下代码
GenericMethod.java
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);
}
}
Driver.java
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
}
}
错误
The method add(capture#1-of ? super ClassB) in the type GenericMethod<capture#1-of ? super ClassB> is not applicable for the arguments (ClassA)
我不明白我哪里出错了。当我实例化GenericMethod 类时,我已经声明它将接受ClassB 的超类型 的任何值,并声明<? super ClassB>。因此,GenericMethod 类中的T 应该接受ClassB 扩展的所有类。
那为什么add 方法会抛出编译时错误呢? add 方法不应该已经知道它正在传递一个完全兼容的类型吗?
【问题讨论】:
标签: java generics extends super