Дженерики в Java: упрощение сортировки и повышение типобезопасности
Дженерики (Generics) позволяют написать один метод/класс, работающий с разными типами, обеспечивая compile-time type safety (проверку типов на этапе компиляции).
Обобщённые методы (Generic Methods)
Один метод для аргументов разных типов. Правила:
- Секция параметров типа в угловых скобках перед возвращаемым типом:
<E>. - Один или несколько параметров типа через запятую.
- Параметры типа используются для возвращаемого типа и типов аргументов.
- Представляют только ссылочные типы (не примитивы: int, double, char).
Пример: печать массива любого типа
public class GenericMethodTest {
public static <E> void printArray(E[] inputArray) {
for (E element : inputArray) System.out.printf("%s ", element);
System.out.println();
}
public static void main(String args[]) {
Integer[] intArray = {1, 2, 3, 4, 5};
Double[] doubleArray = {1.1, 2.2, 3.3, 4.4};
Character[] charArray = {'H', 'E', 'L', 'L', 'O'};
printArray(intArray);
printArray(doubleArray);
printArray(charArray);
}
}
Результат:
Array integerArray contains: 1 2 3 4 5
Array doubleArray contains: 1.1 2.2 3.3 4.4
Array characterArray contains: H E L L O
Ограниченные параметры типа (Bounded Type Parameters)
Ограничение типов, которые можно передать. Синтаксис: <T extends UpperBound>. extends означает «extends» (классы) или «implements» (интерфейсы).
Пример: максимум из трёх Comparable объектов
public class MaximumTest {
public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
T max = x;
if (y.compareTo(max) > 0) max = y;
if (z.compareTo(max) > 0) max = z;
return max;
}
public static void main(String args[]) {
System.out.printf("Max of %d, %d and %d is %d\n", 3, 4, 5, maximum(3, 4, 5));
System.out.printf("Max of %.1f, %.1f and %.1f is %.1f\n", 6.6, 8.8, 7.7, maximum(6.6, 8.8, 7.7));
System.out.printf("Max of %s, %s and %s is %s\n", "pear", "apple", "orange", maximum("pear", "apple", "orange"));
}
}
Результат:
Max of 3, 4 and 5 is 5
Max of 6.6, 8.8 and 7.7 is 8.8
Max of pear, apple and orange is pear
Обобщённые классы (Generic Classes)
Объявление класса с параметром типа после имени: class Box<T>. Могут иметь несколько параметров.
Пример: класс Box
public class Box<T> {
private T t;
public void add(T t) { this.t = t; }
public T get() { return t; }
public static void main(String[] args) {
Box<Integer> integerBox = new Box<>();
Box<String> stringBox = new Box<>();
integerBox.add(10);
stringBox.add("Hello World");
System.out.printf("Integer Value: %d\n", integerBox.get());
System.out.printf("String Value: %s\n", stringBox.get());
}
}
Результат:
Integer Value: 10
String Value: Hello World
java
- Примитивные типы данных в Java: полное руководство с примерами
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
- Освоение приведения типов в Java: от расширения к сужению и далее