Java. Ковариантность и контравариантность обобщенных типов на примере ArrayList.

แชร์
ฝัง
  • เผยแพร่เมื่อ 25 ส.ค. 2024
  • В этом видео я объясняю на примерах, зачем в Java нужны ковариантные и контравариантные типы, как работает объявление параметров обобщенных типов с ключевыми словами super и extends. Рассматриваем подробно как ведут себя ковариантные и контравариантные типы на примере коллекции ArrayList.
    Поддержать канал💰:
    yoomoney.ru/to...
    #ArhiTutorialsJava #ityoutubersru

ความคิดเห็น • 95

  • @axelrod4840
    @axelrod4840 4 ปีที่แล้ว +19

    не могу без мата объянисть на сколько я рад))

  • @user-se1hk9rx4c
    @user-se1hk9rx4c 3 ปีที่แล้ว +21

    весь день не мог понять контравиантность, тут все понятнее стало, спасибо!

    • @user-qs5qr3ng4n
      @user-qs5qr3ng4n 2 ปีที่แล้ว +8

      опять забыл что такое контравариантность, обшерстил весь гугл и нашел свой же коммент))))

    • @fedyaka4
      @fedyaka4 ปีที่แล้ว

      @@user-qs5qr3ng4n ахах, как я тебя понимаю😆

  • @user-ep4oq6kt7y
    @user-ep4oq6kt7y 2 หลายเดือนก่อน

    Спасибо тебе, добрый человек

  • @grinderos.coding
    @grinderos.coding 5 หลายเดือนก่อน

    Это лучшее объяснение по границам вайлдкард, которые я видел и читал. Спасибо тебе огромное.

  • @Sinatra1990
    @Sinatra1990 ปีที่แล้ว +4

    Самая офигитительная, понятная лекция на эту тему. Ваще лассно объяснено, большое спасибо)😀

  • @andrei8299
    @andrei8299 3 ปีที่แล้ว +3

    Очень долго разбирался с этим вопросом и все это приводило к бОльшей каше, даже по видео были непонятки, но вот эта таблица в конце - спасибо за нее большое.

  • @johnvolt9157
    @johnvolt9157 4 ปีที่แล้ว +8

    Блин, спасибо) все вроде знал, но первый раз слышал название этому всему)

  • @dataengineer3961
    @dataengineer3961 3 ปีที่แล้ว +3

    Блииин наконец-то я понял что означают эти вопросики!!!

  • @anastasiiam7836
    @anastasiiam7836 ปีที่แล้ว +2

    Видео-фаворит по этой теме, но только одно замечание :
    При ковариантном типе можно добавить null.
    Пожалуйста поправьте, если я не права :)

  • @jopinfuyiro5570
    @jopinfuyiro5570 ปีที่แล้ว +1

    Спасибо за видео. Сначала было не понятно, когда и почему мы можем брать и добавлять в коллекцию элементы
    Сначала пробовал запоминать мнемонические правила - super - put, extends - get
    Но вместо того чтобы пытаться что-то запомнить наизусть лучше понять почему это можно, а это нельзя. Благодаря этому видео у меня получилось разобраться. В Java всё логично, как и всегда. Спасибо за информацию.

  • @ironoscar3948
    @ironoscar3948 4 ปีที่แล้ว +25

    Есть небольшая неточность: в ковариантный тип можно добавить null

    • @1236Destructor
      @1236Destructor 10 หลายเดือนก่อน +1

      Точно. Как Object сверху, null ограничивает снизу любую иерархию. Этакий супер-потомок 😜

  • @ksenatron
    @ksenatron 3 ปีที่แล้ว +10

    Обьяснение - бомба) спасибо большое

  • @abramovdenis09
    @abramovdenis09 ปีที่แล้ว +2

    Видео хорошее, в идеале бы белую тему на идею или шрифт повыразительнее

  • @milordplus
    @milordplus 10 หลายเดือนก่อน

    Очень круто, спасибо! Смотрел год назад и вот снова смотрю как в первый раз))) Но в этот раз точно запомнил навсегда)))

  • @user-zw9oc7dt8r
    @user-zw9oc7dt8r 2 ปีที่แล้ว +1

    Просто супер, очень понятно рассказано. Не поленился зарегистрироваться ради коммента.

  • @dusheslov2700
    @dusheslov2700 4 ปีที่แล้ว +3

    Брат за ковариантность лайк на все видосы!

  • @mrrnyash8942
    @mrrnyash8942 ปีที่แล้ว +1

    Спасибо, в голове была каша, особенно был неочевиден момент, что в

  • @billerkean1806
    @billerkean1806 ปีที่แล้ว +1

    лайк, хорошее объяснение.

  • @user-uh6yy9lk9y
    @user-uh6yy9lk9y ปีที่แล้ว +1

    Спасибо большое за прекрасный разбор и примеры!

  • @rollingdice
    @rollingdice 2 ปีที่แล้ว +1

    это лучшее видео по данной теме!) спасибо огромное!

  • @severustvr8202
    @severustvr8202 ปีที่แล้ว

    Великолепное объяснение, задоначу с первой зарплаты.

  • @Belovoll
    @Belovoll ปีที่แล้ว

    Спасибо

  • @denisgeraskin5532
    @denisgeraskin5532 ปีที่แล้ว

    Серега, ты красавчик! Я все понял...СПАСИБО!!!

  • @Horoshiy58
    @Horoshiy58 2 ปีที่แล้ว

    Огромная благодарность за объяснение! Все понял сразу, текстовые варианты не давали результат)

  • @m0naco608
    @m0naco608 3 หลายเดือนก่อน

    Спасибо за объяснение !

  • @sanix183
    @sanix183 ปีที่แล้ว

    Сергей, ты лучший разборщик сложных тем!

  • @imbc7867ghuui9
    @imbc7867ghuui9 2 ปีที่แล้ว

    Ухх, супер, то что надо) теперь осталось понять разницу с in out в котлине))

    • @nikolaystepanets2483
      @nikolaystepanets2483 2 ปีที่แล้ว

      В C# аналогичная ситуация, хорошо хоть на Java можно дополнительные примеры найти

  • @user-su1kk4dk7k
    @user-su1kk4dk7k 4 ปีที่แล้ว +1

    Автор топ. Даже расспечатал Q-code и вклеил в тетрадь

  • @user-sl1ti8bx4h
    @user-sl1ti8bx4h 3 ปีที่แล้ว

    Самое лучшее, что нашел про , круто

  • @telephon3208
    @telephon3208 ปีที่แล้ว

    суперконтент!

  • @user-ft7er2le6d
    @user-ft7er2le6d 4 ปีที่แล้ว

    первый видос на эту тему, который, кажется, я понял, надо еще раз пересмотреть, чтобы запомнить

  • @ZubkovKirill
    @ZubkovKirill 10 หลายเดือนก่อน

    Очень хорошее объяснение! Спасибо! Единственное не сказали что этот принцип называется PECS)

  • @user-fn1nm6ie1r
    @user-fn1nm6ie1r 11 หลายเดือนก่อน +1

    Спасибо за Ваши видео. А по спрингу сделаете подборку видео?

    • @arhitutorials
      @arhitutorials  11 หลายเดือนก่อน

      Я в занимаюсь мобильной разработкой. Нет достаточно опыта в спринге, чтоб ему учить.

  • @olyalya9651
    @olyalya9651 ปีที่แล้ว

    Супер объяснение! Спасибо большое!!!!

  • @user-tj3so3pe8n
    @user-tj3so3pe8n 3 ปีที่แล้ว

    Просто и ясно о сложном. Спасибо!

  • @user-jl7kw8hx6i
    @user-jl7kw8hx6i 2 ปีที่แล้ว

    Контент топчик, всё доходчиво разъяснил наконец-то понятно ))))

  • @user-og2ti2wd5o
    @user-og2ti2wd5o ปีที่แล้ว

    таблиця в кінці - це скарб! Дякую

  • @user-tu7bt9ye4u
    @user-tu7bt9ye4u ปีที่แล้ว

    спасибо, благодаря вашему видео понял тему

  • @anastasiyachibisova2496
    @anastasiyachibisova2496 ปีที่แล้ว

    Превосходное обьяснение!

  • @e.s.krivonogov
    @e.s.krivonogov ปีที่แล้ว

    Просто офигенно!

  • @maksigors
    @maksigors ปีที่แล้ว

    спасибо, довольно понятно объяснил)

  • @Aticinsane
    @Aticinsane 2 ปีที่แล้ว

    Отличное объяснение! Спасибо!

  • @d.mertsalov
    @d.mertsalov 4 ปีที่แล้ว +1

    Спасибо! Таблицу законспектировал:)

  • @manul-282
    @manul-282 3 ปีที่แล้ว

    Хороший материал! Большое спасибо!

  • @simplechannel7859
    @simplechannel7859 4 ปีที่แล้ว +1

    Огонь!

  • @user-xc8dn1wz7t
    @user-xc8dn1wz7t 9 หลายเดือนก่อน

    лучший)

  • @frozen1093
    @frozen1093 2 ปีที่แล้ว

    Спасибо, стало чуть понятнее)

  • @pavelkalinin1119
    @pavelkalinin1119 4 ปีที่แล้ว +4

    У Вас на редкость, для программера, хорошо поставлена речь! Спасибо!
    ИнВариантность - по простому, без вариантов)), если то, только его
    КоВариантность - со вариантность

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว +15

      Это не речь, это магия монтажа) Когда монтирую видео, вырезаю все неудачно сказанные фразы, по этому результат получается более-менее приемлемый.
      В случае , у нас есть гарантия, что T как минимум является Type.
      В случае , гарантируется что T - один из предков Type, но какой именно не известно. Из-за этого и возникает ограничение по чтению. Из T безопасно присвоить можно только в Object, потому что точный тип T неизвестен. Зато писать в T можно любых наследников Type, так как они гарантировано могут использоваться везде, где нужен тот самый неизвестный предок Type.
      В общем, вся логика подчинена типобезопасности.

  • @user-yh2cy7oz1j
    @user-yh2cy7oz1j 2 ปีที่แล้ว

    браво!

  • @ivank8812
    @ivank8812 3 ปีที่แล้ว

    Огромное спасибо

  • @TheMarquis
    @TheMarquis 3 ปีที่แล้ว

    Спасибо, очень доступно.

  • @quantumtv9509
    @quantumtv9509 3 ปีที่แล้ว

    Спасибо за видео!)))

  • @svalyavasvalyava9867
    @svalyavasvalyava9867 2 ปีที่แล้ว

    Спасибо!!!

  • @p.shpyro
    @p.shpyro 4 ปีที่แล้ว

    Большое спасибо!

  • @wladimir1366
    @wladimir1366 7 หลายเดือนก่อน

    А как так получается, что в List мы можем добавлять только НАСЛЕДНИКОВ и сам Type, а читать только ПРЕДКОВ и Type? Как это возможно, если List будет состоять только из НАСЛЕДНИКОВ и самого Type?
    UPD: спустя несколько просмотров + просмотра про стирание типов - я все понял
    Спасибо большое!

  • @zhennik263
    @zhennik263 ปีที่แล้ว

    Ну я был на нескольких десятках собеседований на Джависта и ни разу не слышал этого вопроса. Но видос стоит посмотреть

  • @d1ns_799
    @d1ns_799 2 หลายเดือนก่อน

    Получается, что wildcards нужны как раз для того, чтобы обойти свойство инвариантности у производных классов от классов с использованием параметризованных типов (дженериков). Если я правильно это понял

  • @ilya9852
    @ilya9852 ปีที่แล้ว +1

    Таблица 14:30

  • @1236Destructor
    @1236Destructor 10 หลายเดือนก่อน

    Я правильно понимаю, что ин/ко/контр-вариантность - это касается только отношения ссылки и присваиваемой коллекции, т.е. только первая колонка финальной таблицы ???

  • @karaedd
    @karaedd 3 ปีที่แล้ว

    красава

  • @wilyammiller3631
    @wilyammiller3631 ปีที่แล้ว

    меня немного сбивает, что приравнивание идет снизу вверх, такое ощущение, что наоборот

  • @phil2964
    @phil2964 2 ปีที่แล้ว

    👍👍👍👍

  • @fkb_ali
    @fkb_ali ปีที่แล้ว

    а есть видео или статья с объяснением причин: почему нельзя записывать или считывать данные? не догоняю

  • @user-jy6iv3ov2y
    @user-jy6iv3ov2y 8 หลายเดือนก่อน

    Привет! Свпспбо за урок, познавательно! Но у мен вопрос. Вот вы там создали Статичесский класс фрукт, Цитрус и так даллее. Разве статический класс е должен содержать только статичесские поля? У вас обычные? И еще один вопрос, почему у вас вместо знака присваивания тире? ))

    • @arhitutorials
      @arhitutorials  8 หลายเดือนก่อน

      Привет. Статический класс - это обычный класс с обычными полями.

  • @maxkudinov8481
    @maxkudinov8481 ปีที่แล้ว

    В таблице для инвариантного листа можем читать предков, а как в инвариантном листе могут оказаться предки, например number в integer?

  • @alexandr6055
    @alexandr6055 ปีที่แล้ว

    Добрый день. Подскажите, в чем смысл использовать

    • @mangnifista7984
      @mangnifista7984 11 หลายเดือนก่อน

      Да, только в пределах цепочки наследования, а не все подряд. В этом же видео как раз показан такой вариант.
      То есть

  • @sovietunionmissionary
    @sovietunionmissionary 4 หลายเดือนก่อน

    Надо было добавить что иногда могут спросить про принцип pecs и не всегда понятно что речь об этом.

  • @MaximBodrov
    @MaximBodrov ปีที่แล้ว

    Не совсем понял такоей момент: "...extends используется в классах, которые предназначены, чтобы из ни читать, т.е. producer-ах...". А разве продюсер не пишет??? Например, что-то записывает в очередь, который потребитель читатет.

    • @arhitutorials
      @arhitutorials  ปีที่แล้ว

      producer это тот кто производит объекты, а consumer - тот кто потребляет.
      Имеется с виду что из producer читают, но в него не пишут.

    • @MaximBodrov
      @MaximBodrov ปีที่แล้ว

      @@arhitutorials Понял, спасибо!

  • @pawsdev
    @pawsdev 2 ปีที่แล้ว +1

    Проверил в IDE, если SUPER T то добавлять можно только наследников T, если extends T то при заборе через get кастуется до T и его предков, немного сбивате с толку эта ига слов наследники, предки, туда-сюда

  • @AnotherCogInTheMurderMachine
    @AnotherCogInTheMurderMachine ปีที่แล้ว

    Пожалуйста помогите,у меня вопрос: почему на 9:33 делается вывод,что в ArrayList < ? extends Citrus> oranges нельзя НИЧЕГО вставить-понятно,что мы точно не знаем какой там конкретно тип-но мы же точно можем вставить BigRoundOrange ? ведь мы типизируем вышеуказанную коллекцию либо Citrus либо Orange либо BigRoundOrange - и получается,что BigRoundOrange мы точно можем встать ,разве нет? в чем я не прав? (чувствую,что в чем-то не прав)))

    • @arhitutorials
      @arhitutorials  ปีที่แล้ว

      А потом кто-нибудь сделает класс BigRoundLimon, передаст список с ними в эту функцию и все сломается)
      Задача компилятора гарантировать, что код будет всегда правильно работать. Это достигается путем запрета любых вариантов, которые позволяют что-либо сломать.

    • @AnotherCogInTheMurderMachine
      @AnotherCogInTheMurderMachine ปีที่แล้ว

      @@arhitutorials Спасибо вам! я когда вопрос задавал - я забыл,то что от одного класса могут одновременно напрямую несколько классов наследоваться-тогда все ясно,спасибо за видео и за ответ!очень благодарен)я понял теперь почему вообще ничего нельзя добавить в

  • @kaperdi1653
    @kaperdi1653 ปีที่แล้ว

    учу котлин , самое понятное видео

  • @oldjohn1503
    @oldjohn1503 ปีที่แล้ว

    Почему в List

    • @arhitutorials
      @arhitutorials  ปีที่แล้ว

      Потому что это в текущем контексте у листа тип List

    • @oldjohn1503
      @oldjohn1503 ปีที่แล้ว

      @@arhitutorials Все, дошло)) Спасибо за контент)

  • @oldjohn1503
    @oldjohn1503 ปีที่แล้ว

    Почему массивы в java ковариантны?

  • @mashamanina6106
    @mashamanina6106 3 ปีที่แล้ว +2

    Видео на темной теме ужасно, нужно увеличивать видос а это не всегда удобно

  • @noone-hi6kq
    @noone-hi6kq 3 ปีที่แล้ว

    сишарпер что ли

  • @John.Constantine.777
    @John.Constantine.777 ปีที่แล้ว

    Зачем эта вариантность в методах Stream? stateless методы ведь каждый элемент массива отдельно обрабатывают и контейнера то не видят.

  • @donpedro2125
    @donpedro2125 3 หลายเดือนก่อน

    Вот скол ко видосов не смотрю непонимаю, авторы, в чем проблема сделать крупнее шрифт?! У кого то 4к моник и где-то в жопе экрана он пишет код, что кропе как в 4к невозможно смотреть видео. Ну посмотрите как делают англоязычные коллеги.

  • @andreihusakou8223
    @andreihusakou8223 ปีที่แล้ว

    Спасибо

  • @egorvafin1978
    @egorvafin1978 ปีที่แล้ว

    Спасибо

  • @user-ti6kz2sg1u
    @user-ti6kz2sg1u 2 ปีที่แล้ว

    Спасибо