Я просматривал эту статью, чтобы понять роль подстановочного знака super
в генериках. Я понял, как работает extends
, но мне трудно понять, super
У меня есть ClassA
, который расширен на ClassB
, что делает 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>
. Таким образом, T
внутри класса GenericMethod
должен принимать все классы, которые расширяет ClassB
.
Почему метод add
выдает ошибку времени компиляции? Разве метод add
не должен уже знать, что ему передан совершенно совместимый тип?