Size: a a a

2020 June 27

IO

Iaroslav Orlov in pro.jvm
что за ошибка-то?
источник

S

Singular in pro.jvm
'add(capture<? extends Main.Product>)' in 'java.util.List' cannot be applied to '(Main.A1)'
источник

S

Singular in pro.jvm
Это решается если заменить на super. Но почему так не работает?
источник

IO

Iaroslav Orlov in pro.jvm
ну так b1s - это может быть ArrayList<B1>
источник

IO

Iaroslav Orlov in pro.jvm
а туда абстрактный product добавить уже нельзя - нарушается контракт
источник

B

Bogdan in pro.jvm
Singular
class Main {
   public static void main(String[] args) {
       List<A1> a1s = new ArrayList<>();
       List<? extends Product> b1s = new ArrayList<>();

       copyList(a1s, b1s);
   }

   static void copyList(List<? extends A1> src, List<? extends Product> dest){
       for (A1 a1 : src) {
           dest.add(product);////////////-<-<-<-<-<-<-<Ошибка здесь
       }
   }

   class A1 extends Product{}
   class B1 extends Product{}

   class Product{}
}

Здравствуйте, почему a1 не добавляется в лист, он же наследник Product
Потому что в дест могут быть другие наследники, как у вас в примере В1 не наследник А1
источник

IO

Iaroslav Orlov in pro.jvm
если это не B1, но A1, например
источник

S

Singular in pro.jvm
А как тогда решить эту задачу, без super
источник

S

Singular in pro.jvm
Давайте по порядку, а то я запутался, мучаюсь уже не первый день
источник

S

Singular in pro.jvm
1) A1 наследник Product
2) copyList(List<? extends Main.A1> принимает классы наследующие от A1. Странное но почему вообще данный метод принимает этот список. Ведь A1 не наследник A1, он и есть A1
источник

SS

Shamil Sabirov in pro.jvm
Singular
Это решается если заменить на super. Но почему так не работает?
потомушта) "Producer Extends, Consumer Super". и про Type Erasure не забываем
источник

S

Singular in pro.jvm
Shamil Sabirov
потомушта) "Producer Extends, Consumer Super". и про Type Erasure не забываем
Мне больше интерстно узнать почему CopyList вообще работает
источник

SS

Shamil Sabirov in pro.jvm
он компиляется? вопрос изначально вроде был, что код не работает...
источник

S

Singular in pro.jvm
Singular
1) A1 наследник Product
2) copyList(List<? extends Main.A1> принимает классы наследующие от A1. Странное но почему вообще данный метод принимает этот список. Ведь A1 не наследник A1, он и есть A1
@shamil_sabirov Дружище забудь все и обрати пожалуйста внимание на этот коммент, я так быстрее пойму. Я читал про Bounde willcard, статьи и прочие про extends и super. Я просто что - то упустил...
источник

SS

Shamil Sabirov in pro.jvm
в рантайме кстате все что угодно может прилететь. может быть List со строками, Integer, Double. и это будет норм. с точки зрения jvm
источник

S

Singular in pro.jvm
Тоесть аргументы в методах через Generic не проверяется на этапе компиляции?
источник

SS

Shamil Sabirov in pro.jvm
именно. только на этапе компиляции. а в рантайме нет. опять же советую про "Type Erasure" посмотреть в жаве
источник

S

Singular in pro.jvm
жесть, спасибо
источник

AE

Alexandr Emelyanov in pro.jvm
Shamil Sabirov
именно. только на этапе компиляции. а в рантайме нет. опять же советую про "Type Erasure" посмотреть в жаве
В рантайме оно сразу падает с кастом😂
источник

S

Singular in pro.jvm
Разобрался фух)
источник