Оператор Diamond в Java: упрощение дженериков в Java 7+
Оператор Diamond в Java
Оператор diamond (алмазный оператор) был введен в Java 7 для повышения читаемости кода при работе с дженериками (обобщениями). Дженерик — это тип аргумента. Используя дженерики, мы можем передавать объекты любого типа для обработки методами класса. Например, если мы создаем список строк до Java 7, нам нужно использовать следующий синтаксис для создания экземпляра списка строк с объектом ArrayList.
List<String> listOfStrings = new ArrayList<String>();
Начиная с Java 7, мы можем использовать оператор diamond для упрощения вышеуказанного синтаксиса следующим образом:
List<String> listOfStrings = new ArrayList<>();
Но он не мог использоваться с анонимными внутренними классами. Например, мы не могли опустить тип объекта из diamond-оператора в нижеприведенном синтаксисе до Java 9.
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
Diamond-оператор в анонимном классе
В Java 9 diamond-оператор может использоваться с анонимным классом для упрощения кода и улучшения читаемости.
Handler<Integer> intHandler = new Handler<>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
Diamond-оператор в Java 7, Java 8
В приведенном ниже примере мы создали анонимные классы для абстрактного класса Handler, принимающего обобщенный аргумент, и передали тип объекта при создании анонимного класса, так как нам нужно было передать аргумент типа, иначе программа не скомпилируется.
Пример
public class Tester {
public static void main(String[] args) {
// создаем анонимный класс для обработки 1
// Здесь нужно передать типовые аргументы в diamond-операторе
// до Java 9, иначе компилятор выдаст ошибку
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
// создаем анонимный класс для обработки 2
Handler<? extends Number> intHandler1 = new Handler<Number>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler = new Handler<Object>("test") {
@Override
public void handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract class Handler<T> {
public T content;
public Handler(T content) {
this.content = content;
}
abstract void handle();
}
Вывод
Скомпилируем и запустим приведенную выше программу, получим следующий результат:
1 2 Test
Diamond-оператор в Java 9 и далее
С Java 9 мы можем использовать оператор <> с анонимным классом, как показано ниже.
Пример
В приведенном ниже примере мы создали анонимные классы для абстрактного класса Handler, принимающего обобщенный аргумент, но без типа объекта при создании анонимного класса, так как нам не нужно передавать аргумент типа. Компилятор выводит тип автоматически.
public class Tester {
public static void main(String[] args) {
// создаем анонимный класс для обработки 1
// Здесь нам не нужно передавать типовые аргументы в diamond-операторе
// так как компилятор Java 9 может вывести тип автоматически
Handler<Integer> intHandler = new Handler<>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
Handler<? extends Number> intHandler1 = new Handler<>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler = new Handler<>("test") {
@Override
public void handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract class Handler<T> {
public T content;
public Handler(T content) {
this.content = content;
}
abstract void handle();
}
Вывод
Скомпилируем и запустим приведенную выше программу, получим следующий результат:
1 2 Test
java
- Сетевое программирование в Java: создание надежных сетевых приложений с java.net
- Мастерство аргументов командной строки в Java: передача и разбор параметров
- Интерфейс Collection в Java: основные концепции и ключевые методы
- Примитивные типы данных в Java: полное руководство
- Java 9 Collection Factory Methods: удобное создание неизменяемых List, Set, Map
- Java Collections Framework: основные интерфейсы, реализации и практическое использование
- Java 9: улучшенный try-with-resources для чистого кода
- Java String toLowerCase() и toUpperCase(): преобразование регистра с учётом локали
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- JVM: что это такое и архитектура