1. Java / Говнокод #26206

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 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());
       }
    
    }

    АААА... кто-нибудь знает почему нельзя добавить объект С1835 в список? Как это обойти?

    Запостил: mozga, 12 Декабря 2019

    Комментарии (4) RSS

    • Ограничения дженериков. Класть можно в ? super x, доставать из ? extends x
      Почему так?
      Пример -
      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. Таким образом ты нарушить типовую безопасность, которую и должны гарантировать дженерики
      Ответить
      • ага) я это запомнил так. Если ?super, то можно класть все что равно и ниже. Если ?exteds то ничего нельзя. Только извлекать.
        Ответить
    • Въебал минус ублюдкам!
      Ответить

    Добавить комментарий