Дженерики Java
Универсальные шаблоны Java
В этом руководстве мы узнаем о дженериках Java, о том, как создать класс и методы дженериков, а также о их преимуществах с помощью примеров.
Java Generics позволяет создать единый класс, интерфейс и метод, которые можно использовать с различными типами данных (объектов).
Это помогает нам повторно использовать наш код.
Примечание :Общие не работает с примитивными типами (int
, float
, char
и т. д.).
Общий класс Java
Мы можем создать класс, который можно использовать с любым типом данных. Такой класс известен как универсальный класс.
Вот как мы можем создать универсальный класс в Java:
Пример:создание универсального класса
class Main {
public static void main(String[] args) {
// initialize generic class
// with Integer data
GenericsClass<Integer> intObj = new GenericsClass<>(5);
System.out.println("Generic Class returns: " + intObj.getData());
// initialize generic class
// with String data
GenericsClass<String> stringObj = new GenericsClass<>("Java Programming");
System.out.println("Generic Class returns: " + stringObj.getData());
}
}
// create a generics class
class GenericsClass<T> {
// variable of T type
private T data;
public GenericsClass(T data) {
this.data = data;
}
// method that return T type variable
public T getData() {
return this.data;
}
}
Вывод
Generic Class returns: 5 Generic Class returns: Java Programming
В приведенном выше примере мы создали универсальный класс с именем GenericsClass. . Этот класс можно использовать для работы с любым типом данных.
class GenericsClass<T> {...}
Здесь T используется внутри угловой скобки <>
указывает параметр типа . Внутри Main
мы создали два объекта GenericsClass
- intObj - Здесь параметр типа T заменяется на
Integer
. Теперь GenericsClass работает с целочисленными данными. - stringObj - Здесь параметр типа T заменяется на
String
. Теперь GenericsClass работает со строковыми данными.
Универсальный метод Java
Подобно классу дженериков, мы также можем создать метод, который можно использовать с любым типом данных. Такой класс называется универсальным методом.
Вот как мы можем создать универсальный класс в Java:
Пример:создание универсального метода
class Main {
public static void main(String[] args) {
// initialize the class with Integer data
DemoClass demo = new DemoClass();
// generics method working with String
demo.<String>genericsMethod("Java Programming");
// generics method working with integer
demo.<Integer>genericsMethod(25);
}
}
class DemoClass {
// creae a generics method
public <T> void genericsMethod(T data) {
System.out.println("Generics Method:");
System.out.println("Data Passed: " + data);
}
}
Вывод
Generics Method: Data Passed: Java Programming Generics Method: Data Passed: 25
В приведенном выше примере мы создали универсальный метод с именем genericsMethod. .
public <T> void genericMethod(T data) {...}
Здесь параметр типа <T>
вставляется после модификатора public
и перед возвращаемым типом void
.
Мы можем вызвать метод generics, поместив фактический тип <String>
и <Integer>
внутри скобки перед именем метода.
demo.<String>genericMethod("Java Programming");
demo.<Integer>genericMethod(25);
Примечание :мы можем вызвать метод generics без включения параметра типа. Например,
demo.genericsMethod("Java Programming");
В этом случае компилятор может сопоставить параметр типа на основе значения, переданного методу.
<час>Ограниченные типы
Как правило, параметр типа может принимать любые типы данных (кроме примитивных типов).
Однако, если мы хотим использовать дженерики только для некоторых конкретных типов (например, принимать данные числовых типов), мы можем использовать ограниченные типы.
В случае связанных типов мы используем extends
ключевое слово. Например,
<T extends A>
Это означает T может принимать только данные, которые являются подтипами A .
Пример:ограниченные типы
class GenericsClass <T extends Number> {
public void display() {
System.out.println("This is a bounded type generics class.");
}
}
class Main {
public static void main(String[] args) {
// create an object of GenericsClass
GenericsClass<String> obj = new GenericsClass<>();
}
}
В приведенном выше примере мы создали класс с именем GenericsClass. Обратите внимание на выражение, обратите внимание на выражение
<T extends Number>
Здесь GenericsClass создается с ограниченным типом. Это означает GenericsClass может работать только с типами данных, которые являются потомками Number
(Integer
, Double
и т. д.).
Однако мы создали объект класса дженериков с String
. В этом случае мы получим следующую ошибку.
GenericsClass<String> obj = new GenericsClass<>(); ^ reason: inference variable T has incompatible bounds equality constraints: String lower bounds: Number where T is a type-variable: T extends Number declared in class GenericsClass<час>
Преимущества Java Generics
1. Повторное использование кода
С помощью дженериков в Java мы можем писать код, который будет работать с разными типами данных. Например,
public <T> void genericsMethod(T data) {...}
Здесь мы создали метод дженериков. Этот же метод можно использовать для выполнения операций с целочисленными данными, строковыми данными и т. д.
2. Проверка типов во время компиляции
параметр типа дженериков предоставляет информацию о типе данных, используемых в коде дженериков. Например,
// using Generics
GenericsClass<Integer> list = new GenericsClass<>();
Здесь мы знаем, что GenericsClass работает с Integer
только данные.
Теперь, если мы попытаемся передать этому классу данные, отличные от Integer, программа выдаст ошибку во время компиляции.
3. Используется с коллекциями
Каркас коллекций использует концепцию дженериков в Java. Например,
// creating a string type ArrayList
ArrayList<String> list1 = new ArrayList<>();
// creating a integer type ArrayList
ArrayList<Integer> list2 = new ArrayList<>();
В приведенном выше примере мы использовали один и тот же класс ArrayList для работы с разными типами данных.
Аналогично ArrayList
, другие коллекции (LinkedList
, Queue
, Maps
и т. д.) также являются универсальными в Java.
java