Если вы считаете, что ‹K, V›, ‹T› и ‹?› сбивают вас с толку в языке программирования Java; давайте попробуем обобщить и разложить концепцию Genric в языке программирования Java.

Введение в дженерики:
дженерики в Java позволяют создавать гибкие классы, интерфейсы и методы, которые могут работать с разными типами, сохраняя при этом безопасность типов.

Потребность в Genrics в Java:
Представьте, что вы создаете класс с простой целью: сохранить предоставленное ему целочисленное значение и позже распечатать это целое число по запросу. Этот класс можно было бы назвать PrintInts. Вы должны начать с определения его структуры, включающей целочисленное поле с именем «printingValue». Конструктор класса «PrintInts» принимает целочисленный параметр, и внутри него вы присваиваете входное целое число полю «printingValue».
Класс также будет иметь метод «print», отвечающий за отображение сохраненное целое число. Этот метод просто выводит «printingValue» на консоль с помощью функции «System.out.println()».

Чтобы использовать этот класс PrintInts, вы должны инициировать экземпляр с именем printInts, вызвав конструктор и передав желаемое целое число в качестве аргумента. Например, если вы хотите напечатать число 23, вы должны создать принтер, используя «PrintIntsprinter = new IntegerPrinter(23);». Впоследствии вызов «printer.print()» выведет на консоль «23».

Однако если вы хотите добиться одинаковой функциональности для разных типов данных, таких как двойные значения или строки, этот подход становится проблематичным. Вам придется скопировать всю структуру классов, создав отдельные классы, такие как «DoublePrinter» и «StringPrinter», каждый из которых адаптирован для соответствующих типов данных. Это приводит к чрезмерному дублированию кода и проблемам с обслуживанием.

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

Как использовать Genrics:
Вместо создания отдельных классов вы можете определить универсальный класс, который использует тип-заполнитель, часто обозначаемый как «T». Этот тип затем можно указать при создании экземпляров класса, что позволит вам создать один класс, который работает с целыми числами, двойными числами, строками и любым другим типом данных, который может вам понадобиться.

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

Используя дженерики, вы можете свести к минимуму дублирование кода и повысить удобство сопровождения кода. Это становится особенно важным для более сложных классов, где избыточное дублирование кода было бы еще более обременительным. Обобщенные шаблоны упрощают процесс, позволяя создавать адаптируемые классы, способные обрабатывать множество типов данных, устраняя необходимость в избыточных реализациях.

ПРИМЕЧАНИЕ:
1. Обобщенные типы не работают с примитивными типами, такими как Int в нижнем регистре и Long в нижнем регистре, но все, что вам нужно сделать, это просто использовать классы-оболочки, такие как Integer, и все должно работать одинаково.
2. Одно место, где вы, вероятно, уже постоянно использовали дженерики, - это структура коллекций Java, например, если вы хотели создать ArrayList, вы, вероятно, сделали это, указав в угловых скобках тип объекта, который вы хотите иметь в своем списке, поэтому, если вы хотите создать ArrayList‹Integer›, ArrayList‹Double› и т. д.

Дополнительные варианты Genrics:

  1. Ограниченные дженерики для класса или интерфейсов.
  2. Дженерики в методах
  3. Дикая карта? и ограниченные подстановочные знаки в дженериках