Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

Generics в Java: использование и объявление обобщённых типов

💻 Информатика · 10 класс

List<String>, собственный Holder<T> и два параметра: что проверяется компилятором.

Клавиатура в компьютерном классе
Иллюстрация к предмету «Информатика»Hmartil · Wikimedia Commons · CC BY-SA 4.0

Тип становится параметром

Generics позволяют описать класс, интерфейс или метод с параметром типа. Вместо написания отдельного контейнера для строк и отдельного для чисел задают один алгоритм и указывают нужный тип при использовании. Это не передача обычного значения: Integer и String являются аргументами типа.

Например, List<String> описывает список строк. Компилятор проверит попытку добавить Integer и отклонит её. При чтении элемента не потребуется ручное приведение Object к String. Такой контроль помогает обнаружить ошибку до запуска.

Использование готового типа

import java.util.ArrayList;
import java.util.List;

List<String> names = new ArrayList<>();
names.add("Lena");
String first = names.get(0);
System.out.println(first.length());

Фрагмент выполняется внутри метода. Результат — 4. Угловые скобки справа с пустым содержимым называются diamond: компилятор выводит аргумент типа из контекста. Это не raw type. Запись names.add(12) не подходит: автоматическая упаковка дала бы Integer, а требуется String.

Собственный обобщённый класс

class Holder<T> {
    private final T value;

    Holder(T value) {
        this.value = value;
    }

    T get() {
        return value;
    }
}

Параметр T объявлен после имени класса. Его можно использовать как тип поля, параметра конструктора и результата метода. Слово T условно: приняты краткие заглавные имена, но смысл задаётся объявлением, а не особой магией буквы.

Holder<Integer> number = new Holder<>(21);
Holder<String> text = new Holder<>("map");
System.out.println(number.get() + 1);
System.out.println(text.get().length());

Эти строки внутри метода выведут 22 и 3. В первом объекте T заменён на Integer, во втором — на String. Само объявление переменной Holder<Integer> без new ещё не создаёт объект.

Несколько параметров

Можно объявить class Pair<K, V> и использовать K для первого поля, V — для второго. Например, Pair<String, Integer> связывает строковый ключ и число. Порядок параметров значим: замена местами меняет ожидаемые типы соответствующих полей и аргументов.

Важное различие: в Holder<T> буква T — формальный параметр объявления; в Holder<String> String — конкретный аргумент при использовании. Не нужно объявлять новый класс с именем String или передавать объект String вместо параметра типа.

Границы механизма

Аргументы типа — ссылочные типы: используется Integer, а не int. Generics не доказывают правильность любого содержимого: List<String> может содержать пустые строки или null, если реализация это допускает. Кроме того, List<Integer> не является подтипом List<Number>; для гибких API существуют wildcard-типы.

При стирании типов компилятор преобразует обобщённый код, поэтому нельзя считать каждый Holder<String> отдельным созданным во время выполнения классом, в отличие от Holder<Integer>. Новичку достаточно сохранять типизацию и избегать обхода проверок через raw types.

Практика

  1. Почему Holder<int> неверен?
  2. Что выведет text.get().length() для "map"?
  3. Где параметр, а где аргумент: Pair<K,V> и Pair<String,Integer>?

Ответы

1. Нужен ссылочный тип Integer. 2. 3: get возвращает String. 3. K и V — параметры объявления; String и Integer — аргументы использования. Это различие позволяет читать API и самостоятельно объявлять обобщённые классы.

Связанные материалы

Источники и материалы