Generics (Обобщения) — это мощный инструмент в Java, позволяющий создавать классы, интерфейсы и методы, которые могут работать с различными типами данных, сохраняя при этом строгую типизацию.
Зачем они нужны? Главная цель — безопасность типов (type safety) и избавление от явного приведения типов (casting). Используя дженерики, вы сообщаете компилятору, с каким типом данных будет работать коллекция или класс.
Синтаксис использует угловые скобки: List. Символ в скобках (например, ) называется параметром типа. Это позволяет создавать универсальные контейнеры, в которые по ошибке нельзя положить объект неправильного типа.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Параметры типа
Внимательно изучите объявление обобщённого класса Box на языке Java. Ваша задача — кликнуть на все места в коде, где используется параметр типа T. Параметр типа T может встречаться в объявлении самого класса, в объявлении поля класса и в объявлении методов. Не отмечайте имена класса, имена методов, ключевые слова языка, скобки или другие элементы, не являющиеся параметром типа.
{{public~|~d1}} {{class~|~d2}} {{Box~|~d3}}<{{T~|~t1}}> {
{{private~|~d4}} {{T~|~t2}} {{value~|~d5}};
{{public~|~d6}} {{Box~|~d7}}({{T~|~t3}} {{value~|~d8}}) {
{{this~|~d9}}.{{value~|~d10}} = {{value~|~d11}};
}
{{public~|~d12}} {{T~|~t4}} {{getValue~|~d13}}() {
{{return~|~d14}} {{value~|~d15}};
}
{{public~|~d16}} {{void~|~d17}} {{setValue~|~d18}}({{T~|~t5}} {{value~|~d19}}) {
{{this~|~d20}}.{{value~|~d21}} = {{value~|~d22}};
}
}2. Diamond operator
В этом задании необходимо создать экземпляр коллекции ArrayList для хранения строк, используя diamond operator (<>). Заполните пропуски в коде так, чтобы объявление переменной и создание экземпляра коллекции были корректными. Обратите внимание, что переменная должна иметь тип интерфейса List, а создаваемый объект — ArrayList. После заполнения пропусков код должен компилироваться и выполнять добавление строки в список с последующим выводом.
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
input1S list = new ArrayListinput2S();
list.add("Hello");
System.out.println(list.get(0));
}
}3. Сырые и обобщенные типы
Перед вами несколько объявлений списков в Java. Разнесите их по двум категориям: 'Raw Type (без дженериков)' и 'Generic Type (с дженериками)'. Обратите внимание, что сырой тип (raw type) — это использование обобщенного класса без указания параметра типа, а обобщенный тип (generic type) — с указанием параметра типа в угловых скобках.
List list = new ArrayList();List<String> list = new ArrayList<>();ArrayList rawList = new ArrayList();ArrayList<Integer> numbers = new ArrayList<>();List raw = new LinkedList();List<Double> doubles = new LinkedList<Double>();4. Несовпадение типов
В данном фрагменте кода на Java допущена ошибка, связанная с использованием обобщённых типов (Generics). Объявлен список, предназначенный для хранения целых чисел, но в него пытаются добавить значение другого типа. Найдите строку с ошибкой и исправьте её, чтобы код успешно компилировался и выполнялся.
import java.util.ArrayList;import java.util.List;public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); numbers.add("10"); System.out.println(numbers); }}5. Создание Generic класса
Перед вами строки java-кода для создания простого обобщенного (generic) класса Wrapper. Класс Wrapper предназначен для инкапсуляции значения произвольного типа T. Расставьте строки в правильном порядке, чтобы получился корректный Java-класс, содержащий одно приватное поле типа T, конструктор, принимающий значение этого типа, и геттер для доступа к полю. Обратите внимание на структуру класса: объявление класса с параметром типа, затем поле, затем конструктор, затем метод.
public class Wrapper<T> { public Wrapper(T value) { return value; } this.value = value; public T getValue() { }} private T value;6. Соглашения об именовании
В этом задании вам предстоит заполнить пропуски в тексте, описывающем стандартные соглашения об именовании параметров типов в Java Generics. Для каждого пропуска выберите подходящую букву из выпадающего списка, соответствующую общепринятому обозначению (T, K, V, E). Это поможет закрепить понимание типичных имен параметров, используемых в обобщённых классах и методах.
В Java Generics существуют стандартные соглашения об именовании параметров типов:
input1S— используется для обозначения произвольного типа (от слова Type).input2S— используется для ключа (Key) в ассоциативных массивах (например, вMap<K, V>).input3S— используется для значения (Value) в ассоциативных массивах (например, вMap<K, V>).input4S— используется для элемента (Element) коллекций, например, вList<E>.