Я наткнулся на кусок кода, который заставляет меня задаться вопросом, почему он успешно компилируется:
public class Main {
public static void main(String[] args) {
String s = newList(); // why does this line compile?
System.out.println(s);
}
private static <T extends List<Integer>> T newList() {
return (T) new ArrayList<Integer>();
}
}
Интересно, что если я изменяю сигнатуру метода newList
с помощью <T extends ArrayList<Integer>>
, она больше не работает.
Обновление после комментариев и ответов: Если я переведу общий тип из метода в класс, код больше не компилируется:
public class SomeClass<T extends List<Integer>> {
public void main(String[] args) {
String s = newList(); // this doesn't compile anymore
System.out.println(s);
}
private T newList() {
return (T) new ArrayList<Integer>();
}
}