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:
- Não pode ser utilizado em classe anônima, pois é impossível inferir os tipos.
- Você pode colocar espaços no operador diamante, mas por questão de estilo não é recomendado.