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

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

1. обзор

В этой статье мы рассмотримdiamond operator in Java and how generics and the Collections API influenced its evolution.

2. Сырые Типы

Prior to Java 1.5, the Collections API supported only raw types - не было возможности параметризации аргументов типа при создании коллекции:

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

Это позволило добавить любой тип иled to potential casting exceptions at runtime.

3. Дженерики

В Java 1.5 были введены Generics -which allowed us to parameterize the type arguments for classes, в том числе в API коллекций - при объявлении и построении объектов:

List cars = new ArrayList();

На этом этапе у нас естьspecify the parameterized type in the constructor, который может быть несколько нечитаемым:

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

Причина этого подхода в том, чтоraw types still exist for the sake of backward compatibility, поэтому компилятор должен различать эти необработанные типы и дженерики:

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

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

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

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

Оператор алмаза - введен в Java 1.7 -adds type inference and reduces the verbosity in the assignments – when using generics:

List cars = new ArrayList<>();

Функция вывода типа компилятора Java 1.7determines the most suitable constructor declaration that matches the invocation.

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

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

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

Car myCar = new Car<>();

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

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

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

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