Перейти к основному содержимому
Модуль 6 · Урок 2 из 212/14 в курсе~15 min
Уроки модуля (2/2)

Дженерики в Java

Обобщенные (универсальные типы) были введены в Java, чтобы позволить классам, интерфейсам и методам работать с разными типами в качестве параметров. Это обеспечивает безопасность типов во время компиляции и позволяет избежать дорогостоящих явных приведений во время выполнения.

Общие классы

Универсальный класс определяется с помощью угловых скобок <T>, где T выступает в качестве заполнителя для типа, который будет указан при создании экземпляра класса.

Java
public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

При создании объекта Box мы указываем фактический тип:

Java
Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
int value = integerBox.getContent(); // No cast needed!

Общие методы

Вы можете определить один универсальный метод, который может принимать параметры разных типов. Параметр типа помещается перед типом возвращаемого значения метода.

Java
public static <E> void printArray(E[] elements) {
    for (E element : elements) {
        System.out.println(element);
    }
}

Подстановочные знаки и ограниченные типы

Мы можем ограничить типы, принимаемые универсальным шаблоном, используя ключевое слово extends (верхняя граница), чтобы принимать определенный тип или его подклассы.

Java
public static <T extends Number> void processNumber(T number) {
    // Accepts Integer, Double, Float, etc.
    System.out.println(number.doubleValue());
}

Попробуйте сами

Упражнение#java.m6.l2.e1
Попыток: 0Загрузка…

Завершите универсальный класс Box, определив метод получения getValue(), который возвращает T, и метод установки setValue(T value), который устанавливает значение частной переменной.

Загрузка редактора…
Показать подсказку

Напишите методы с правильной сигнатурой, используя параметр универсального типа `T`.

Решение доступно после 3 попыток

Упражнение#java.m6.l2.e2
Попыток: 0Загрузка…

Создайте статический универсальный метод printArray, который принимает массив типа T[] с именем array и печатает каждый элемент с помощью цикла for-each.

Загрузка редактора…
Показать подсказку

Параметр типа `<T>` должен быть помещен сразу после `static` и перед возвращаемым типом `void`.

Решение доступно после 3 попыток

Упражнение#java.m6.l2.e3
Попыток: 0Загрузка…

Создайте статический класс StringContainer, который реализует интерфейс контейнера, параметризованный с помощью String. Определите конструктор, который принимает параметр String, и реализуйте метод getItem().

Загрузка редактора…
Показать подсказку

Замените общий тип «T» на «String» в сигнатуре класса и в возвращаемом типе getItem().

Решение доступно после 3 попыток