Можно создать дубликат:
Why won't this generic java code compile?Почему это (неправильное) использование Java-дженериков не компилируется?
Учитывая следующий код:
import java.util.Collections;
import java.util.List;
public class ComeGetSome {
//TODO: private final Some<?> some = new Some();
private final Some some = new Some();
public static void main(String[] args) {
new ComeGetSome().dude();
}
public void dude() {
for (String str : some.getSomeStrings()) { //FIXME: does not compile!
System.out.println(str);
}
}
}
class Some<T> {
public List<String> getSomeStrings() {
return Collections.<String> emptyList();
}
}
Это не компилируется, потому что some.getSomeStrings()
возвращает необработанный List
. Но подпись метода указывает, что она возвращает List<String>
!
Как-то это связано с тем фактом, что Some
имеет объявление типа, но имеет ссылку как необработанный тип. Исправлена проблема с ссылкой на Some<?>
. Но метод не имеет ничего общего с объявлением типа в классе!
Почему компилятор ведет себя так?
Collections.emptyList() ?? –
См. Также http://stackoverflow.com/questions/1661068/java-generics-vanishing-type-information –