Почему этот универсальный код компилируется в Java 8?
Я наткнулся на фрагмент кода, который заставляет меня задуматься, почему он успешно компилируется:
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>();
}
}