Что такое дженерики в Java? Руководство для начинающих по изучению дженериков

Рассмотрим пример, когда вам нужно составить список живых существ в местности. Неважно, человек это, животное или растение. Все, что имеет значение, это живое существо. В этом случае вы бы сгруппировали их всех как «Живые существа», а не классифицировали. Точно так же, когда вам нужно хранить некоторые данные, для вас важно содержимое, а не тип данных, и именно здесь вы используете универсальные шаблоны. Обобщения в Java — это языковая функция, позволяющая использовать общие типы и методы.

Что такое дженерики в Java?

Дженерики — это термин, обозначающий набор языковых функций, связанных с определением и использованием универсальных типов и методов. Универсальные методы Java отличаются от обычных типов данных и методов. До дженериков мы использовали коллекция для хранения любого типа объектов, т.е. не универсальный. Теперь дженерики заставляют Java-программиста хранить объекты определенного типа.

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

Почему Java-дженерики?

Если вы посмотрите на классы фреймворка коллекций Java, то заметите, что большинство классов принимают параметр/аргумент типа Object. По сути, в этой форме они могут принимать любой тип Java в качестве аргумента и возвращать тот же объект или аргумент. Они по существу неоднородный т.е. не подобного типа.

Коллекция-framework-hierarchy.png

Иногда в приложении Java тип данных ввода не фиксирован. Вход может быть целое числоа плавать или же Строка Java. Чтобы присвоить ввод переменной правильного типа данных, необходимо было провести предварительные проверки. В традиционном подходе после получения ввода проверялся тип данных ввода, а затем присваивался переменной нужного типа данных. При использовании этой логики длина кода и время выполнения увеличивались. Чтобы избежать этого, Были введены дженерики. Когда вы используете Generics, параметры в коде автоматически проверяются во время компиляции, и он устанавливает тип данных по умолчанию. Так что здесь вам нужна концепция дженериков в Java.

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

Типы дженериков Java

Существует 4 различных способа применения дженериков в Java, и они следующие:

  1. Общий тип класса
  2. Общий интерфейс
  3. Общий метод
  4. Общий конструктор

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

1. Класс общего типа

Класс называется универсальным, если он объявляет одну или несколько переменных типа. Эти типы переменных известны как параметры типа класса Java. Давайте разберемся в этом с помощью примера. В приведенном ниже примере я создам класс с одним свойством Икс и тип свойства — объект.

class Genericclass{
private Object x;
public void set(Object x) { this.x = x; }
public Object get() { return x; }
}

Здесь, как только вы инициализируете класс с определенным типом, класс должен использоваться только с этим конкретным типом. Например, если вы хотите, чтобы один экземпляр класса содержал значение Икс типа ‘ Нить ‘, то программист должен установить и получить единственный тип String. Поскольку я объявил тип свойства для объекта, нет никакого способа применить это ограничение. Программист может установить любой объект и ожидать от него любого типа возвращаемого значения. получить метод поскольку все типы Java являются подтипами класса Object.

Чтобы применить этот тип ограничения, мы можем использовать дженерики, как показано ниже:

class Genericclass<X> {
//T stands for "Type"
private T x;
public void set(T x) { this.x = x; }
public T get() { return x; }
}

Теперь вы можете быть уверены, что class не будет использоваться неправильно с неправильными типами. Простой пример «Genericclass» выглядит так, как показано ниже:

Genericclass<String> instance = new Genericclass<String>();
instance.set("Edureka");
instance.set(10); //This will raise compile time error

Так вот как это работает. Эта аналогия верна и для интерфейса. Давайте быстро рассмотрим пример, чтобы понять, как информация о типах дженериков может использоваться в интерфейсах в java.

2. Общий интерфейс

Интерфейс в Java относится к абстрактным типам данных. Они позволяют управлять коллекциями Java независимо от деталей их представления. Кроме того, они образуют иерархию в объектно-ориентированного программирования языки. Давайте разберемся, как универсальный тип можно применить к интерфейсам в Java.

//Generic interface definition
interface GenericInterface<T1, T2>
{
T2 PerformExecution(T1 x);
T1 ReverseExecution(T2 x);
}

//A class implementing generic interface
class Genericclass implements GenericInterface<String, Integer>
{
public Integer PerformExecution(String x)
{
//execution code
}
public String ReverseExecution(Integer x)
{
//execution code
}
}

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

3. Общие методы

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

Давайте разберемся с этим на примере. Ниже приведен пример универсального метода, который можно использовать для поиска всех вхождений параметров типа в списке переменных.

public static <T> int countAllOccurrences(T[] list, T element) {
int count = 0;
if (element == null) {
for ( T listElement : list )
if (listElement == null)
count++;
}
else {
for ( T listElement : list )
if (element.equals(listElement))
count++;
}
return count;
}

Если вы передадите список строк для поиска в этом методе, он будет работать нормально. Но если вы попытаетесь найти число в списке строк, это выдаст ошибку времени компиляции.

Эта аналогия аналогична и конструктору. Давайте возьмем пример универсального конструктора и поймем, как он работает.

4. Общий конструктор

Конструктор это блок кода, который инициализирует только что созданный объект. А конструктор напоминает метод экземпляра в Java, но это не метод, поскольку он не имеет возвращаемого типа. Конструктор имеет то же имя, что и класс, и выглядит так в коде Java. Теперь давайте возьмем пример и поймем, как это работает.

class Dimension<T>
{
private T length;
private T width;
private T height;

//Generic constructor
public Dimension(T length, T width, T height)
{
super();
this.length = length;
this.width = width;
this.height = height;
}
}

В приведенном выше примере конструктор класса Dimension имеет информацию о типе. Таким образом, вы можете иметь экземпляр измерения со всеми атрибутами только одного типа. Итак, вот как вы можете использовать конструкторы дженериков. Надеюсь, вы поняли типы дженериков в Java.

Теперь давайте двинемся дальше и посмотрим на преимущества Generics в Java.

Преимущества дженериков в Java

1. Повторное использование кода

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

2. Кастинг индивидуальных типов не требуется

По сути, вы каждый раз восстанавливали информацию из ArrayList, вам нужно привести ее к типу. Приведение типов в каждой задаче восстановления — это большая мигрень. Чтобы искоренить этот подход, были введены дженерики.

3. Реализация необобщенного алгоритма

Он может вычислять алгоритмы, которые работают с различными типами элементов, которые также безопасны для типов.

Это было все о преимуществах Java Generics. На этом мы подошли к концу этой статьи об обобщениях в Java. Я надеюсь, что вы нашли его информативным и помогли вам понять Java Generics.

Есть к нам вопрос? Пожалуйста, укажите это в разделе комментариев к этой статье, и мы свяжемся с вами как можно скорее.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *