«1. Обзор

В этой статье мы рассмотрим оператор Diamond в Java и то, как дженерики и 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<String> cars = new ArrayList<String>();

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

Map<String, List<Map<String, Map<String, Integer>>>> cars 
 = new HashMap<String, List<Map<String, Map<String, Integer>>>>();

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

List<String> generics = new ArrayList<String>();
List<String> raws = new ArrayList();

4. Алмазный оператор ~ ~~ Алмазный оператор, представленный в Java 1.7, добавляет вывод типа и уменьшает количество детализации в присваиваниях — при использовании дженериков:

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

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

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

List<String> cars = new ArrayList<>();

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

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

public interface Engine { }
public class Diesel implements Engine { }
public interface Vehicle<T extends Engine> { }
public class Car<T extends Engine> implements Vehicle<T> { }

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

Car<Diesel> myCar = new Car<>();

Проще говоря, алмазный оператор добавляет компилятору возможность вывода типов и уменьшает многословие в присваиваниях, представленных дженериками.

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

«

Some examples of this tutorial can be found on the GitHub project, so feel free to download it and play with it.