Почему этот универсальный код компилируется в 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>();
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос