Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Оператор 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

  1. Сетевое программирование в Java: создание надежных сетевых приложений с java.net
  2. Мастерство аргументов командной строки в Java: передача и разбор параметров
  3. Интерфейс Collection в Java: основные концепции и ключевые методы
  4. Примитивные типы данных в Java: полное руководство
  5. Java 9 Collection Factory Methods: удобное создание неизменяемых List, Set, Map
  6. Java Collections Framework: основные интерфейсы, реализации и практическое использование
  7. Java 9: улучшенный try-with-resources для чистого кода
  8. Java String toLowerCase() и toUpperCase(): преобразование регистра с учётом локали
  9. Рефлексия в Java: инспекция классов, методов и полей во время выполнения
  10. JVM: что это такое и архитектура