Я получаю сообщение об ошибке компилятора, вызывающее универсальный метод с явными параметрами типа, как если бы параметр явного типа не был принят во внимание. Минимальный пример:
class CastExample {
static class ThingProducer<S> {
public <T> T getThing() { return null; }
}
static class ThingA {}
public static void main(String... args) {
ThingProducer thingProducer = new ThingProducer();
ThingA thingA = thingProducer.<ThingA>getThing(); // compile error here
}
}
ThingProducer
— это необработанный тип, поскольку у класса есть параметр типа, но при вызове getThing
мы не ссылаемся на параметр типа class, а вместо этого предоставляем параметр типа method. Согласно моему пониманию JLS, это должно быть законным, но это дает мне эту ошибку:
incompatible types: Object cannot be converted to ThingA
Ошибка исчезает, если я
- удалить
<S>
изThingProducer
- или сделать
getThing
статичным - объявить
thingProducer ThingProducer<?>
вместо необработанного типаThingProducer
Это ошибка компилятора? Если нет, то какое правило в JLS определяет такое поведение?
ThingProducer thingProducer
в вашем main - это необработанный тип. Плохо плохо плохо. Например, сThingProducer<?> thingProducer
ваш код компилируется нормально. - person Tunaki   schedule 16.11.2015