— И ещё одна крутая тема.
— Одни сюрпризы. Прямо не день, а день рождения.
— Сегодня я расскажу тебе, что такое Generics. “Дженерики” – это типы с параметром. В Java классы-контейнеры позволяют указывать тип их внутренних объектов.
— Когда мы объявляем generic-переменную, то мы указываем не один тип, а два: тип переменной и тип данных, которые она у себя хранит.
Хороший пример этого – ArrayList. Когда мы создаём новый объект/переменную типа ArrayList, нам удобно указать, значения какого типа будут храниться внутри этого списка.
Код | Пояснение |
---|---|
|
Мы создали переменную list типа ArrayList.Занесли в нее объект типа ArrayList. В таком списке можно хранить только переменные типа String. |
|
Мы создали переменную list типа ArrayList.Занесли в нее объект типа ArrayList.В таком листе можно хранить переменные любого типа. |
|
Мы создали переменную 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> |
— Примитивные типы и их классы-аналоги (классы-обёртки) можно спокойно присваивать друг другу:
Примеры |
---|
|
|
|
|
|
— Отлично. Тогда я думаю, я буду почаще использовать ArrayList.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ