Рубрики
Без рубрики

Руководство по Алмазному оператору на Java

Краткое и практическое руководство по алмазному оператору, которое было введено в Java 7.

Автор оригинала: baeldung.

1. Обзор

В этой статье мы рассмотрим оператор diamond в Java и то, как generics и API коллекций повлияли на его эволюцию .

2. Необработанные Типы

До Java 1.5 API коллекций поддерживал только необработанные типы – при построении коллекции не было возможности параметризовать аргументы типа:

List cars = new ArrayList();
cars.add(new Object());
cars.add("car");
cars.add(new Integer(1));

Это позволило добавить любой тип и привело к потенциальным исключениям приведения во время выполнения .

3. Дженерики

В Java 1.5 были введены дженерики– , которые позволили нам параметризовать аргументы типа для классов , в том числе в API коллекций – при объявлении и построении объектов:

List cars = new ArrayList();

На этом этапе мы должны указать параметризованный тип в конструкторе , который может быть несколько нечитаемым:

Map>>> cars 
 = new HashMap>>>();

Причина такого подхода заключается в том , что необработанные типы все еще существуют для обеспечения обратной совместимости , поэтому компилятору необходимо различать эти необработанные типы и универсальные типы:

List generics = new ArrayList();
List raws = new ArrayList();

Несмотря на то, что компилятор по-прежнему позволяет нам использовать необработанные типы в конструкторе, он выдаст нам предупреждающее сообщение:

ArrayList is a raw type. References to generic type ArrayList should be parameterized

4. Алмазный оператор

Оператор diamond – введенный в Java 1.7 – добавляет вывод типов и уменьшает многословие в назначениях – при использовании дженериков :

List cars = new ArrayList<>();

Функция вывода типов компилятора Java 1.7 определяет наиболее подходящее объявление конструктора, соответствующее вызову .

Рассмотрим следующий интерфейс и иерархию классов для работы с транспортными средствами и двигателями:

public interface Engine { }
public class Diesel implements Engine { }
public interface Vehicle { }
public class Car implements Vehicle { }

Давайте создадим новый экземпляр Car с помощью оператора diamond:

Car myCar = new Car<>();

Внутренне компилятор знает, что Diesel реализует интерфейс Engine , а затем может определить подходящий конструктор, выведя тип.

5. Заключение

Проще говоря, оператор diamond добавляет функцию вывода типов в компилятор и уменьшает многословие в назначениях, введенных с помощью универсальных методов.

Некоторые примеры этого руководства можно найти в проекте GitHub , поэтому не стесняйтесь загружать его и играть с ним.