У меня есть вопрос о дженериках в Java, а именно об использовании подстановочных знаков. У меня есть пример класса GenClass:
public class GenClass<E> {
private E var;
public void setVar(E x) {
var = x;
}
public E getVar() {
return var;
}
}
У меня есть еще один простой класс:
public class ExampleClass {
}
Я написал следующий тестовый класс:
public class TestGenClass {
public static void main(String[] str) {
ExampleClass ec = new ExampleClass();
GenClass<ExampleClass> c = new GenClass<ExampleClass>();
c.setVar(ec);
System.out.println(c.getVar()); // OUTPUT: ExampleClass@addbf1
}
}
Теперь, если я использую подстановочный знак и пишу в тестовом классе это:
GenClass<?> c = new GenClass<ExampleClass>();
на месте:
GenClass<ExampleClass> c = new GenClass<ExampleClass>();
у компилятора нет проблем с этим новым оператором, однако он жалуется на
c.setVar(ec);
В нем говорится, что «метод (setVar()) неприменим для аргументов (ExampleClass)». Почему я получаю это сообщение?
Я думал, что то, как я использовал подстановочный знак, делает ссылочную переменную c типа GenClass, которая будет принимать в качестве параметра любой класс - на месте E у меня будет любой класс. Это просто объявление переменной. Затем я инициализирую его с помощью
new GenClass<ExampleClass>()
это означает, что я создаю объект типа GenClass, который имеет в качестве параметра класс типа ExampleClass. Итак, я думаю, что теперь E в GenClass будет ExampleClass, и я смогу использовать метод setVar(), передав ему в качестве аргумента что-то типа ExampleClass. Это было мое предположение и понимание, но, похоже, Java это не нравится, и я не прав. Любой комментарий приветствуется, спасибо.