Diamante no Java (Java 7)

Continuando nossa sequencia de posts do Java 7, vamos abordar agora o uso do diamante <>. Com esse operador eliminamos a necessidade de redundâncias dos tipos em classes parametrizadas. Na especificação do Java 7 está descrito como um melhoria na inferência de tipos na criação de instâncias de genéricos.

Na prática, a gente transforma código assim:

		List<String> listaStringDiamante = new ArrayList<String>();
		Map<String, Integer> dicionario = new HashMap<String, Integer>();

Em código assim:

		List<String> listaStringDiamante = new ArrayList<>();
		Map<String, Integer> dicionario = new HashMap<>();

Você pode se perguntar, mas antes eu podia fazer assim:

List<String> listaString = new ArrayList();

Para demonstrar que isso é um problema, veja o seguinte código:

		List<String> listaString = new ArrayList();
		listaString.add("String");
		List<Integer> listaInteger = new ArrayList(listaString); // Sem uso de diamante
		List<Integer> listaIntegerDiamante = new ArrayList<>(listaString); // Com uso de diamante

Na linha 3 o compilador permite a inclusão de uma lista de String em uma lista de Integer. Já no caso do operador diamante o compilador infere que o novo ArrayList criado é do tipo Integer e portanto no construtor do generics só vai aceitar coleções que tenham elementos que herdam de Integer. Então na linha 4 temos um erro de compilação. Dessa forma evitamos códigos incorretos!

Outros exemplos possíveis:

		List<?> listaDeAlgo = new ArrayList<>();
		List listaSemGenerics = new ArrayList<>();

O último exemplo não é recomendado, mas é possível. Um outro ponto, é que não podemos utilizar o operador diamante em classes anônimas. Sem operador diamante isso é possível, por exemplo:

		new List<String>() {
		...
		}

Só implementar os métodos necessários para o List e a classe anônima funcionará corretamente. O mesmo não é possível com operador diamante:

		new List<>() {
		...
		}

Nesse caso temos um erro de compilação.

Pontos importantes:

  1. Não pode ser utilizado em classe anônima, pois é impossível inferir os tipos.
  2. Você pode colocar espaços no operador diamante, mas por questão de estilo não é recomendado.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6