Может кто-нибудь объяснить мне следующее поведение?
У меня есть список X и используйте метод addAll() для добавления элементов. Эти элементы возвращаются методом, использующим общие типы. Метод getA() возвращает < T extends A >, когда A является классом. Метод getI() возвращает < T extends I > с I, являющимся интерфейсом (см. Код ниже).
Разница: с listX.addAll(getA()) Я получаю ошибку компиляции (как и ожидалось), но listX.addAll(getI()) компилирует (выдает ошибку времени выполнения, когда элемент отличен до X).
Упрощенный код:
interface I {}
class A implements I {}
class X {}
public void test() {
List<X> listX = new ArrayList<>();
listX.addAll(getA());
listX.addAll(getI());
for (X x : listX) {}
}
public <T extends A> List<T> getA() {
return new ArrayList<>();
}
public <T extends I> List<T> getI() {
return new ArrayList<>();
}
Я что-то упустил? Разве я не должен получать ошибку компиляции в оба раза?
Такое поведение кажется новым с Java 8, с версиями ниже я получил ошибки компилятора в обоих случаях.