Освоение Java Generics: создание переиспользуемого, типобезопасного кода
Java Generics — создание переиспользуемого, типобезопасного кода
Java generics позволяют написать один класс, интерфейс или метод, работающий со многими разными типами данных, сохраняя безопасность типов на этапе компиляции.
Примечание: Generics не работают с примитивными типами (int, float, char и т.д.).
Обобщённый класс в Java
Объявив параметр типа, можно создать класс, работающий с любым объектным типом.
Пример: создание обобщённого класса
class Main {
public static void main(String[] args) {
GenericsClass<Integer> intObj = new GenericsClass<>(5);
System.out.println("Generic Class returns: " + intObj.getData());
GenericsClass<String> stringObj = new GenericsClass<>("Java Programming");
System.out.println("Generic Class returns: " + stringObj.getData());
}
}
class GenericsClass<T> {
private T data;
public GenericsClass(T data) {
this.data = data;
}
public T getData() {
return this.data;
}
}
Вывод
Generic Class returns: 5 Generic Class returns: Java Programming
В примере GenericsClass — обобщённый класс, где T — параметр типа. Созданы два экземпляра:
- intObj — T заменён на
Integer, класс работает с целыми числами. - stringObj — T заменён на
String, класс работает со строками.
Обобщённый метод в Java
Методы также могут быть обобщёнными, позволяя принимать аргументы любого типа с сохранением типобезопасности.
Пример: создание обобщённого метода
class Main {
public static void main(String[] args) {
DemoClass demo = new DemoClass();
demo.<String>genericsMethod("Java Programming");
demo.<Integer>genericsMethod(25);
}
}
class DemoClass {
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
Когда компилятор может вывести тип, явный аргумент типа можно опустить:
demo.genericsMethod("Java Programming");
Ограниченные типы (Bounded Types)
Иногда нужно, чтобы обобщённый тип принимал только определённое семейство классов. Ограниченные типы достигают этого через ключевое слово extends.
Синтаксис: <T extends A> — T может быть A или любым подтипом 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) {
// GenericsClass<String> obj = new GenericsClass<>(); // ошибка компиляции
}
}
Здесь GenericsClass принимает только числовые типы (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. Переиспользование кода
Обобщённый код работает с множеством типов данных, уменьшая дублирование. Один метод может обрабатывать целые, строки и пользовательские объекты.
2. Проверка типов на этапе компиляции
Так как параметр типа известен во время компиляции, компилятор может обнаружить несоответствия типов до запуска программы.
3. Бесшовная интеграция с коллекциями
Фреймворк коллекций Java основан на generics, позволяя коллекциям обеспечивать типобезопасность. Примеры:
ArrayList<String> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
Другие классы коллекций (LinkedList, Queue, Map и т.д.) также используют generics для тех же преимуществ.
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Наследование в Java: концепции, типы и практические примеры
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Мастерство Java ArrayList: операции, методы и лучшие практики
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление