Конфликт дженерик метода
Есть класс:
static class Test<T> {
T t;
<P> P get(P p) {
return p;
}
}
Если его метод вызвать так, то все хороше:
Test<String> test = new Test();
int i = test.get(1);
А если убрать дженерик тип с класса, то возникает ошибка:
Test test = new Test();
int i = test.get(1);//error - java.lang.Object cannot be converted to int
Почему такое поведение? Как глобальный дженерик тип T связан с тем что в методе P?
Ответы (1 шт):
Как глобальный дженерик тип T связан с тем что в методе P?
Тип T на уровне класса никак не связан с типом P, используемым в методе.
Однако, если класс, объявленный как обобщённый (дженерик), не предоставляет никакой информации о типе обобщения как в случае Test test = new Test(), такой класс "превращается" в "грязный" класс (raw type) ещё на этапе компиляции и ему будет соответствовать код:
static class Test {
Object t;
Object get(Object p) {
return p;
}
}
Соответственно, компилятор будет возмущаться при попытке присвоить числу объект Object в строке int i = test.get(1);, о чём, собственно, и сообщает ошибка: error: incompatible types: Object cannot be converted to int.
Если очень хочется скомпилировать этот шедевр без указания типа в классе, достаточно использовать кастинг:
Test test = new Test(); // raw-type Test
int i = (Integer) test.get(1); // test.get returns Object
Аналогичный пример в ответе на основном SO: Using no parameters disables generics entirely.