Оператор Java Diamond:упрощение дженериков в Java 7+
Оператор Java Diamond
Оператор ромба был представлен в Java 7, чтобы сделать код более читаемым для универсальных шаблонов. Общий — это тип аргумента. Используя generic, мы можем передать любой тип объекта для обработки методами класса. Например, если мы создаем список строк до Java 7, нам нужно использовать следующий синтаксис для создания экземпляра списка строк с помощью объекта ArrayList.
List<String> listOfStrings = new ArrayList<String>();
Начиная с Java 7, мы можем использовать оператор ромба, чтобы упростить приведенный выше синтаксис следующим образом:
List<String> listOfStrings = new ArrayList<>();
Но его нельзя было использовать с внутренними классами Anonymous. Например, мы не можем опустить тип объекта в операторе ромба в приведенном ниже синтаксисе до версии Java 9.
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
Оператор Diamond в анонимном классе
В Java 9 оператор ромба также можно использовать с анонимным классом для упрощения кода и улучшения читаемости.
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) {
// create an Anonymous class to handle 1
// Here we need to pass Type arguments in diamond operator
// before Java 9 otherwise compiler will complain error
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
// create an Anonymous class to 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) {
// create an Anonymous class to handle 1
// Here we do not need to pass Type arguments in diamond operator
// as Java 9 compiler can infer the type automatically
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