JavaRush /Курсы /Java Syntax /Дженерики — что это?

Дженерики — что это?

Java Syntax
7 уровень , 7 лекция
Открыта

— И ещё одна крутая тема.

— Одни сюрпризы. Прямо не день, а день рождения.

— Сегодня я расскажу тебе, что такое Generics. “Дженерики” – это типы с параметром. В Java классы-контейнеры позволяют указывать тип их внутренних объектов.

— Когда мы объявляем generic-переменную, то мы указываем не один тип, а два: тип переменной и тип данных, которые она у себя хранит.

Хороший пример этого – ArrayList. Когда мы создаём новый объект/переменную типа ArrayList, нам удобно указать, значения какого типа будут храниться внутри этого списка.

Код Пояснение
ArrayList<String> list = new ArrayList<String>();
Мы создали переменную list типа ArrayList.
Занесли в нее объект типа ArrayList.
В таком списке можно хранить только переменные типа String.
ArrayList list = new ArrayList();
Мы создали переменную list типа ArrayList.
Занесли в нее объект типа ArrayList.В таком листе можно хранить переменные любого типа.
ArrayList<Integer> list = new ArrayList<Integer>();
Мы создали переменную list типа ArrayList.
Занесли в нее объект типа ArrayList.
В таком листе можно хранить только переменные типа Integer и int.

— Звучит очень интересно. Особенно про любой тип.

— Это только кажется, что это хорошо. На самом деле, если в одном методе в ArrayList кладутся строки, а в другом мы работаем с его содержимым и ожидаем, что там будут только числа, программа упадет (закроется с ошибкой).

— Ясно.

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

— А в качестве типа-параметра можно поставить любой класс, даже тот, что напишу я?

— Да, любой тип, кроме примитивных типов. Все классы-параметры должны быть унаследованы от класса Object.

— То есть, я не могу написать ArrayList<int>?

— В общем-то, да, не можешь. Но для примитивных типов разработчики языка Java написали их непримитивные аналоги — классы, унаследованные от Object. Вот как это будет выглядеть:

Примитивный тип Класс Список
int Integer ArrayList<Integer>
double Double ArrayList<Double>
boolean Boolean ArrayList<Boolean>
char Character ArrayList<Character>
byte Byte ArrayList<Byte>

— Примитивные типы и их классы-аналоги (классы-обёртки) можно спокойно присваивать друг другу:

Примеры
int a = 5;
Integer b = a;
int c = b;

Character c = 'c'; //литерал 'c' имеет тип char
char d = c;
Byte b = (byte) 77; //литерал 77 имеет тип int
Boolean isOk = true; //литерал true имеет тип boolean
Double d = 1.0d; //литерал 1.0d имеет тип double

— Отлично. Тогда я думаю, я буду почаще использовать ArrayList.

7
Опрос
Функции, 7 уровень, 7 лекция
Недоступен
Функции
Функции
Комментарии (170)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
11 февраля 2024
Момент по дженериками , о котором говорят на скиллбоксе : Не стоит создавать ArrayList list = new ArrayList(); --- т.е. без указания типа. Джава машина такой код считает, даже позволит накидать туда переменные разных типов. Но при обработке скорее всего выбросит ошибку. Дело в том, что дженерики появились не сразу и в старых сборках их не было. Возможность создавать коллекцию без указания типа оставили для поддерживания старого кода, но сейчас так делать не рекомендуется.
Rolik Уровень 41
17 марта 2023
Параметризаторы (generics).
Антон Войтенко Уровень 27
10 марта 2023
Какая жуть в пояснительной статье... На этом уровне лучше туда даже не смотреть. Ступор случается. в этой: https://skillbox.ru/media/base/dzheneriki-v-java-dlya-samykh-malenkikh/
Иван Уровень 23
29 мая 2023
Отлично, нашел там, что искал. Большое спасибо! Сайт JavaRush хороший, но иногда приходится в другом месте поискать данные.
Ramil Уровень 13
13 июля 2022
если вдруг не совсем поняли что такое дженерики, то вот статья неплохая тык
Иван Уровень 23
13 июля 2022
Спасибо!!!
Иван Уровень 23
29 мая 2023
Отлично, нашел там, что искал. Большое спасибо! Сайт JavaRush хороший, но иногда приходится в другом месте поискать данные.
Максим Уровень 30
16 мая 2022
Привет Кирилл. Тоже уже дошел до дженериков? Насколько я помню это была очень легкая к восприятию статья
Kirill Krainov-Timanovsky Уровень 41
21 апреля 2022
Привет! А почему лекция недоступна? Пытаюсь её снова открыть, а мне выдаёт, что доступ есть, но продолжает не пускать. Подскажите, пожалуйста, в чём дело.
Damir Уровень 17
24 ноября 2021
Byte b = (byte) 77; //литерал 77 имеет тип int - с этим не совсем понятно, здесь нет ошибки?
PERFORATTOR Уровень 19
29 ноября 2021
Может до конвертации его имеет?
Andrei Уровень 7
31 января 2022
Нет, ошибки нету. Любой целочисленный литерал по - умолчанию имеет тип int. int не может автоматически конвертироваться в тип меньше его (narrowing - сужение).
Дима Уровень 16
3 июля 2021
Чёт я не до конца понял, я всегда писал ArrayList<String> list = new ArrayList<>() (без уточнения после равно что это String), а тут такого варианта нет))) Так его обязательно писать или нет?
Дима Уровень 16
3 июля 2021
Нашёл ответ. Не удалял свой комент, если вдруг кто-то как я озадачится) после java 7 писать справа не обязательно) Упростили, вот и всё) вот тут человек об этом и другом рассказывает про дженерики
Andrei Уровень 7
31 января 2022
Не обязательно, вы правильно пишете
Balthazar Уровень 8
20 июня 2021
Обычно в комментах тема обсуждается, а тут чёт лайки все просят...🤨
Domingo el Sumeri Уровень 13
11 февраля 2021
Видео лекция про дженерики и их использовании в объектах Collections. У меня многое встало по своим местам, надеюсь правильно) Generics, Collections - Java для тестировщиков
Дмитрий Коляскин Уровень 32 Expert
13 апреля 2021
там 1:10:24 по времени, жесть)
kir.svetly Уровень 8
17 апреля 2021
Но лекция действительно крутая. Я смотрю на скорости 1,25)
Ramil Уровень 13
13 июля 2022
хотел просто посмотреть че за видос, уже 13 минут оторваться не могу 😃 Челик очень круто объясняет, хочется прям слушать, но самое главное понятно))
Иван Уровень 23
13 июля 2022
Спасибо за наводку на ютуб канал!