У меня есть вопрос об Generics в 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 не нравится, и я не прав.
Любые комментарии приветствуются, спасибо.