0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Попрактикуемся в создании дженериков на примере такой коллекции как пара. Подобный тип данных встречается во многих языках и имитируется в Java с помощью мапы:<a>Map.entry(key, value)</a>. Пара содержит два элемента, которые можно получить из пары и установить новые. Простейший пример использования пары - это точки на плоскости.</p>
1
<p>Попрактикуемся в создании дженериков на примере такой коллекции как пара. Подобный тип данных встречается во многих языках и имитируется в Java с помощью мапы:<a>Map.entry(key, value)</a>. Пара содержит два элемента, которые можно получить из пары и установить новые. Простейший пример использования пары - это точки на плоскости.</p>
2
<h2>Один параметр типа</h2>
2
<h2>Один параметр типа</h2>
3
<p>Начнем с примера. Ниже код использования пары как точки на плоскости.</p>
3
<p>Начнем с примера. Ниже код использования пары как точки на плоскости.</p>
4
<p>Для простоты наша пара будет работать с одним параметром типа, который определяет тип обоих значений в паре. Напишем соответствующий класс:</p>
4
<p>Для простоты наша пара будет работать с одним параметром типа, который определяет тип обоих значений в паре. Напишем соответствующий класс:</p>
5
<p>Для того чтобы дженерики понимались проще, можно представлять дженерик как определение метода. В угловых скобках указывается имя параметра, который будет передан внутрь при "вызове дженерика". Внутри этот параметр используется уже без скобок. Даже в определении методов, которые ожидают данные этого типа как параметры.</p>
5
<p>Для того чтобы дженерики понимались проще, можно представлять дженерик как определение метода. В угловых скобках указывается имя параметра, который будет передан внутрь при "вызове дженерика". Внутри этот параметр используется уже без скобок. Даже в определении методов, которые ожидают данные этого типа как параметры.</p>
6
<p>Синтаксически в определении методов ничего не поменялось, кроме того, что вместо конкретного типа мы подставляем параметр типа T. В случае геттеров мы возвращаем данные этого типа, в случае сеттеров - получаем на вход.</p>
6
<p>Синтаксически в определении методов ничего не поменялось, кроме того, что вместо конкретного типа мы подставляем параметр типа T. В случае геттеров мы возвращаем данные этого типа, в случае сеттеров - получаем на вход.</p>
7
<p>Теперь создадим дженерик-интерфейс, по аналогии с интерфейсом List.</p>
7
<p>Теперь создадим дженерик-интерфейс, по аналогии с интерфейсом List.</p>
8
<p>И реализуем его.</p>
8
<p>И реализуем его.</p>
9
<p>Параметр типа указывается и для класса и для интерфейса. В остальном в классе ничего не меняется. Сделав такое изменение, мы получаем возможность подменять реализацию. В случае с парами это не очень актуально, но общая концепция становится понятна.</p>
9
<p>Параметр типа указывается и для класса и для интерфейса. В остальном в классе ничего не меняется. Сделав такое изменение, мы получаем возможность подменять реализацию. В случае с парами это не очень актуально, но общая концепция становится понятна.</p>
10
<h2>Два параметра типа</h2>
10
<h2>Два параметра типа</h2>
11
<p>Изменим нашу пару так, чтобы тип каждого параметра выбирался независимо. Пример использования.</p>
11
<p>Изменим нашу пару так, чтобы тип каждого параметра выбирался независимо. Пример использования.</p>
12
<p>Сначала поправим интерфейс.</p>
12
<p>Сначала поправим интерфейс.</p>
13
<p>Два параметра типа выглядят как параметры в определении метода. В этот раз, для удобства восприятия, взяты имена L и R. Порядок параметров типов мы определяем сами, в данном случае логично разместить слева параметр отвечающий за left, а справа отвечающий за right.</p>
13
<p>Два параметра типа выглядят как параметры в определении метода. В этот раз, для удобства восприятия, взяты имена L и R. Порядок параметров типов мы определяем сами, в данном случае логично разместить слева параметр отвечающий за left, а справа отвечающий за right.</p>
14
<p>Следующий шаг поменять класс.</p>
14
<p>Следующий шаг поменять класс.</p>
15
<p>И последнее, что мы сделаем, добавим конструктор, который позволяет передавать значения для пары в одну строку. Кроме того, в таком случае, компилятор автоматически выводит тип передаваемых значений, что позволяет не прописывать явно параметры типов.</p>
15
<p>И последнее, что мы сделаем, добавим конструктор, который позволяет передавать значения для пары в одну строку. Кроме того, в таком случае, компилятор автоматически выводит тип передаваемых значений, что позволяет не прописывать явно параметры типов.</p>
16
<p>Реализация:</p>
16
<p>Реализация:</p>
17
17