Может кто-нибудь объяснить мне следующее поведение?
У меня есть список 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, с версиями ниже я получил ошибки компилятора в обоих случаях.