Guia para o operador Diamond em Java
1. Visão geral
Neste artigo, veremosdiamond operator in Java and how generics and the Collections API influenced its evolution.
2. Tipos brutos
Prior to Java 1.5, the Collections API supported only raw types - não havia nenhuma maneira de os argumentos de tipo serem parametrizados ao construir uma coleção:
List cars = new ArrayList();
cars.add(new Object());
cars.add("car");
cars.add(new Integer(1));
Isso permitiu a adição de qualquer tipo eled to potential casting exceptions at runtime.
3. Genéricos
No Java 1.5, foram introduzidos os genéricos -which allowed us to parameterize the type arguments for classes, incluindo aqueles na API de coleções - ao declarar e construir objetos:
List cars = new ArrayList();
Neste ponto, temos quespecify the parameterized type in the constructor, que pode ser um tanto ilegível:
Map>>> cars
= new HashMap>>>();
A razão para essa abordagem é queraw types still exist for the sake of backward compatibility, então o compilador precisa diferenciar entre esses tipos brutos e genéricos:
List generics = new ArrayList();
List raws = new ArrayList();
Mesmo que o compilador ainda nos permita usar tipos brutos no construtor, ele nos solicitará uma mensagem de aviso:
ArrayList is a raw type. References to generic type ArrayListshould be parameterized
4. Operador Diamante
O operador diamante - introduzido em Java 1.7 -adds type inference and reduces the verbosity in the assignments – when using generics:
List cars = new ArrayList<>();
O recurso de inferência de tipo do compilador Java 1.7determines the most suitable constructor declaration that matches the invocation.
Considere a seguinte interface e hierarquia de classes para trabalhar com veículos e motores:
public interface Engine { }
public class Diesel implements Engine { }
public interface Vehicle { }
public class Car implements Vehicle { }
Vamos criar uma nova instância de aCar usando o operador diamante:
Car myCar = new Car<>();
Internamente, o compilador sabe queDiesel implementa a interfaceEngine e é capaz de determinar um construtor adequado inferindo o tipo.
5. Conclusão
Simplificando, o operador diamante adiciona o recurso de inferência de tipo ao compilador e reduz a verbosidade nas atribuições introduzidas com genéricos.
Alguns exemplos deste tutorial podem ser encontradoson the GitHub project, então fique à vontade para baixá-lo e brincar com ele.