Сколько же я уже перечитал, никак не мог разобраться с этими сырыми типами и стиранием типов, а тут за 15 минут повторил что же вообще такое джинерики и зачем они, да еще и наконец понял смысл всего этого. Спасибо огромное за потрясающий материал!
Очень хорошие лекции. В плане улучшения видео я посоветовал бы вам использовать микрофон. На плохих колонках, наушниках и на мобильных устройствах эхо и другие звуки аудитории довольно сильно портят восприятие.
Странно, но я перепечатал код с 8:08 и у меня нету никаких Warning. Почему так? А в 12:00 так вообще я не могу написать такой код, IDE не дает скомпилировать, дает ошибку на `SomeType.test(list);`, предлагает сменить входной во второй test тип с Integer на String. ЧЯДНТ?
с 8:30 до 8:30 речь меня просто ввела в кому.. транскрипт: "тот факт, что мы как бы его переназначили... ссылки... компилятору пофиг, потому что.... почему? в рантайме информация вся стерлась. В рантайме вся дженерик информация она стирается, то есть, кмопилятор, он проверил, все хорошо, все совпадает, rawList может принимать восьмерку, он ее назначил и ОК, а в райнтайме никаких проверок в принципе не происходит, потому что лист есть лист, он может принимать объекты и ему все хорошо" попробую переозвучить, так, как это было бы идеально для меня лично: "несмотря на то, что теперь rawList ссылается на объект ArrayList с дженериком, не мешает компилятору "одобрить" добавление Integer'а в лист, потому что во время операции добавления .add() компилятор проверяет наличие дженерика ТОЛЬКО у ссылки, но не у объекта, на который она ссылается, соотв-но т.к. у rawList дженерика нет, СЧИТАЕТСЯ что она ссылается на список объектов. Во время рантайма треугльные скобки у ArrayList как бы стираются и на самом деле в куче лежит всегда объект ArrayList одинаковый для всех типов ссылок будь-то List, List и т.д. То есть то, ЧТО ПРЕДПОЛАГАЕТСЯ хранить в этом листе описывает только ссылка"
Петро Костур 5 месяцев назад Спасибо! но у меня есть одно замечание: если выполнить пример с кадра на минуте 12:23, то у меня нету никакого ClassCastException. Без проблем вызывается первый метод test. и у меня нет никакого эксепшена.
Прикол в том, что если в первом и во втором test поменять местами Collection и List, то все без проблем сработает. То есть компилятор читает все-таки сигнатуру полностью (а параметры туда входят, в сигнатуру метода то есть) и если видит где-то более полное совпадение, то тот test и берет. Получается, что если у нас будет public void test (List list) и public void test (Collection) то без проблем компилятор закинет list именно в первый test
Спасибо! но у меня есть одно замечание: если выполнить пример с кадра на минуте 12:23, то у меня нету никакого ClassCastException. Без проблем вызывается первый метод test.
Проверь внимательно написание своего кода. Скорее всего ты объявил класс SomeType без обобщения T: class SomeType {...} У меня же в примере класс объявлен следующим образом: class SomeType /T/ {...}
Не совсем понял на каком основании компилятор вызывает первый метод test во втором случае, если в рантайме все равно нет никакой информации о дженериках?
Вы говорите, что в рантайме можно узнать реальный тип, но ведь это неправда. С помощью рефлексии можно узнать только "ваши" названия типов (T, E, K etc), а подставляемый тип вам не узнать. Т.к. в Jave есть механизм стирания до первого ограничения. Почитайте Эккеля.
Сбор средств для помощи ЗСУ 🇺🇦 Слава Україні! 🇺🇦
www.yuriytkach.com/volunteer
Спасибо за нормальный монтаж! Бережете время смотрящего, и результат без воды и лишних задержек
Сколько же я уже перечитал, никак не мог разобраться с этими сырыми типами и стиранием типов, а тут за 15 минут повторил что же вообще такое джинерики и зачем они, да еще и наконец понял смысл всего этого. Спасибо огромное за потрясающий материал!
Никогда не скучно смотреть Ваши видео, а с небольшими quizes вообще на ура заходит!
Очень хорошие лекции. В плане улучшения видео я посоветовал бы вам использовать микрофон. На плохих колонках, наушниках и на мобильных устройствах эхо и другие звуки аудитории довольно сильно портят восприятие.
Классный пример на 12ой минуте! Мой мозг сломан!
Спасибо большое! Короткие ролики - самое то!!!
Странно, но я перепечатал код с 8:08 и у меня нету никаких Warning. Почему так?
А в 12:00 так вообще я не могу написать такой код, IDE не дает скомпилировать, дает ошибку на `SomeType.test(list);`, предлагает сменить входной во второй test тип с Integer на String. ЧЯДНТ?
Юрий, огромное спасибо за лекции!!!
с 8:30 до 8:30 речь меня просто ввела в кому.. транскрипт:
"тот факт, что мы как бы его переназначили... ссылки... компилятору пофиг, потому что.... почему? в рантайме информация вся стерлась. В рантайме вся дженерик информация она стирается, то есть, кмопилятор, он проверил, все хорошо, все совпадает, rawList может принимать восьмерку, он ее назначил и ОК, а в райнтайме никаких проверок в принципе не происходит, потому что лист есть лист, он может принимать объекты и ему все хорошо"
попробую переозвучить, так, как это было бы идеально для меня лично:
"несмотря на то, что теперь rawList ссылается на объект ArrayList с дженериком, не мешает компилятору "одобрить" добавление Integer'а в лист, потому что во время операции добавления .add() компилятор проверяет наличие дженерика ТОЛЬКО у ссылки, но не у объекта, на который она ссылается, соотв-но т.к. у rawList дженерика нет, СЧИТАЕТСЯ что она ссылается на список объектов. Во время рантайма треугльные скобки у ArrayList как бы стираются и на самом деле в куче лежит всегда объект ArrayList одинаковый для всех типов ссылок будь-то List, List и т.д. То есть то, ЧТО ПРЕДПОЛАГАЕТСЯ хранить в этом листе описывает только ссылка"
Молодец! Спасибо!
Спасибо
Петро Костур
5 месяцев назад
Спасибо! но у меня есть одно замечание: если выполнить пример с кадра на минуте 12:23, то у меня нету никакого ClassCastException. Без проблем вызывается первый метод test.
и у меня нет никакого эксепшена.
всмысле он случится только тогда, когда пойдём по циклу
Есть. Но они будут доступны чуть позже
Прикол в том, что если в первом и во втором test поменять местами Collection и List, то все без проблем сработает.
То есть компилятор читает все-таки сигнатуру полностью (а параметры туда входят, в сигнатуру метода то есть) и если видит где-то более полное совпадение, то тот test и берет.
Получается, что если у нас будет
public void test (List list) и public void test (Collection) то без проблем компилятор закинет list именно в первый test
если у нас есть класс Human из которого наследуються класс Student и Teacher, и из Student наследуется класс Graduate.
Human
Битте :)
Спасибо!
но у меня есть одно замечание: если выполнить пример с кадра на минуте 12:23, то у меня нету никакого ClassCastException. Без проблем вызывается первый метод test.
Проверь внимательно написание своего кода. Скорее всего ты объявил класс SomeType без обобщения T:
class SomeType {...}
У меня же в примере класс объявлен следующим образом:
class SomeType /T/ {...}
Не совсем понял на каком основании компилятор вызывает первый метод test во втором случае, если в рантайме все равно нет никакой информации о дженериках?
Информация о том, какой метод вызвать, была получена во время компиляции.
Логично. Спасибо =)
Вы говорите, что в рантайме можно узнать реальный тип, но ведь это неправда. С помощью рефлексии можно узнать только "ваши" названия типов (T, E, K etc), а подставляемый тип вам не узнать. Т.к. в Jave есть механизм стирания до первого ограничения. Почитайте Эккеля.
Я дума имеется ввиду тип объекта который мы получаем с помощью get(), а не дженерик
эти штучки ( скобки ) называются diamond.
Чёрт, я реально становлюсь умнее после этих лекций
Данке
Как всегда качество звука хреновое у него
Слава Украине
Героям Слава!