Что такое дженерики в Java? Руководство для начинающих по изучению дженериков
Рассмотрим пример, когда вам нужно составить список живых существ в местности. Неважно, человек это, животное или растение. Все, что имеет значение, это живое существо. В этом случае вы бы сгруппировали их всех как «Живые существа», а не классифицировали. Точно так же, когда вам нужно хранить некоторые данные, для вас важно содержимое, а не тип данных, и именно здесь вы используете универсальные шаблоны. Обобщения в Java — это языковая функция, позволяющая использовать общие типы и методы.
Что такое дженерики в Java?
Дженерики — это термин, обозначающий набор языковых функций, связанных с определением и использованием универсальных типов и методов. Универсальные методы Java отличаются от обычных типов данных и методов. До дженериков мы использовали коллекция для хранения любого типа объектов, т.е. не универсальный. Теперь дженерики заставляют Java-программиста хранить объекты определенного типа.
Теперь, когда вы знаете, что такое Generics в Java, давайте двигаться дальше и понять, зачем вам нужны Java Generics.
Почему Java-дженерики?
Если вы посмотрите на классы фреймворка коллекций Java, то заметите, что большинство классов принимают параметр/аргумент типа Object. По сути, в этой форме они могут принимать любой тип Java в качестве аргумента и возвращать тот же объект или аргумент. Они по существу неоднородный т.е. не подобного типа.
Иногда в приложении Java тип данных ввода не фиксирован. Вход может быть целое числоа плавать или же Строка Java. Чтобы присвоить ввод переменной правильного типа данных, необходимо было провести предварительные проверки. В традиционном подходе после получения ввода проверялся тип данных ввода, а затем присваивался переменной нужного типа данных. При использовании этой логики длина кода и время выполнения увеличивались. Чтобы избежать этого, Были введены дженерики. Когда вы используете Generics, параметры в коде автоматически проверяются во время компиляции, и он устанавливает тип данных по умолчанию. Так что здесь вам нужна концепция дженериков в Java.
Теперь, когда вы получили некоторое представление о универсальных шаблонах, давайте двигаться дальше и рассмотрим различные способы применения универсальных шаблонов к исходному коду.
Типы дженериков Java
Существует 4 различных способа применения дженериков в Java, и они следующие:
- Общий тип класса
- Общий интерфейс
- Общий метод
- Общий конструктор
Теперь давайте разберемся, как дженерики можно применить к классу типов.
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.
Есть к нам вопрос? Пожалуйста, укажите это в разделе комментариев к этой статье, и мы свяжемся с вами как можно скорее.