Я получаю ошибку компилятора, вызывающую общий метод с явными параметрами типа, как если бы явный параметр типа не учитывался. Минимальный пример:Явный тип метода метода игнорируется в сыром классе; ошибка компилятора?
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
мы не ссылается параметр типа класса, но вместо предоставления метода параметр типа. За мое понимание JLS, это должно быть законным, но это дает мне эту ошибку:
incompatible types: Object cannot be converted to ThingA
ошибка исчезает, если я
- удалить
<S>
изThingProducer
- или сделать
getThing
статический - объявить
thingProducer ThingProducer<?>
вместо необработанного типаThingProducer
Является ли это ошибкой компилятора? Если нет, какое правило в JLS определяет это поведение?
'ThingProducer thingProducer' в вашем основном сырье. Плохо плохо плохо. Например, с 'ThingProducer > thingProducer', ваш код компилируется в порядке. – Tunaki
Верно, но он все равно должен компилироваться как необработанный тип - в случае, если я не ссылаюсь на этот параметр типа. –
Где находится вопрос о том, что это дубликат? Я искал, прежде чем спрашивать. –