Понятие Generics (обобщения)

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

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

Зачем они нужны? Главная цель — безопасность типов (type safety) и избавление от явного приведения типов (casting). Используя дженерики, вы сообщаете компилятору, с каким типом данных будет работать коллекция или класс.

Синтаксис использует угловые скобки: List list = new ArrayList<>();. Символ в скобках (например, ) называется параметром типа. Это позволяет создавать универсальные контейнеры, в которые по ошибке нельзя положить объект неправильного типа.

Список тем

1. Параметры типа

id: 40507_gen_01_click_params

Внимательно изучите объявление обобщённого класса 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

id: 40507_gen_02_replace_diamond

В этом задании необходимо создать экземпляр коллекции 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 сек.
Показать подсказку

3. Сырые и обобщенные типы

id: 40507_gen_03_sort_concepts

Перед вами несколько объявлений списков в Java. Разнесите их по двум категориям: 'Raw Type (без дженериков)' и 'Generic Type (с дженериками)'. Обратите внимание, что сырой тип (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. Несовпадение типов

id: 40507_gen_04_error_mismatch

В данном фрагменте кода на 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);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Создание Generic класса

id: 40507_gen_05_sequencing_class

Перед вами строки 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. Соглашения об именовании

id: 40507_gen_06_select_conventions

В этом задании вам предстоит заполнить пропуски в тексте, описывающем стандартные соглашения об именовании параметров типов в Java Generics. Для каждого пропуска выберите подходящую букву из выпадающего списка, соответствующую общепринятому обозначению (T, K, V, E). Это поможет закрепить понимание типичных имен параметров, используемых в обобщённых классах и методах.

Нужно правильно расставить в пропуски предложенные варианты

В Java Generics существуют стандартные соглашения об именовании параметров типов:

  • input1S — используется для обозначения произвольного типа (от слова Type).
  • input2S — используется для ключа (Key) в ассоциативных массивах (например, в Map<K, V>).
  • input3S — используется для значения (Value) в ассоциативных массивах (например, в Map<K, V>).
  • input4S — используется для элемента (Element) коллекций, например, в List<E>.
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру