- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
public class C1834 { }
class C1835 extends C1834 { }
public class C1836 {
public void m5(ArrayList<? extends C1834> strList)
{
List<? extends C1834> list = new ArrayList<>();
list.add(new C1835());
}
}
Почему так?
Пример -
Class A, class B extends A, class C extends A.
Допустим, в метод, параметром которого является List<? extends A> придёт List<B>, или может прийти любой другой лист, тип которого extends A.
В данном случае B extends A, все ок.
1. Если ты будешь вытаскивать элементы из такого списка, они гарантированно будут extends A.
2. Теперь по поводу помещения элементов в список. У тебя пришёл список типа B, но виден он под дженериком ? extends A. Если ты попробуешь положить в него C, то получится что ты положишь C в список типа B. Но B extends A, но не C. Таким образом ты нарушить типовую безопасность, которую и должны гарантировать дженерики