Conceito | Código |
Na linguagem Java devemos declarar os tipos das variáveis obrigatoriamente. Em Java declaramos o tipo da variável e somente podemos atribuir valores deste tipo. | // Não compila por falta de inf. do tipo.
public class InferenciaDeTipo {
public static void main(String[] args){
int valor1 = 10;
String valor2 = "Valor";
naoPermitido = 42;
}
} |
Melhoras na inferência dos tipos genéricos | // Java 7
foo(Utility.<Type>bar());
Utility.<Type>foo().bar();
// Java 8
foo(Utility.bar());
Utility.foo().bar(); |
Pode-se substituir os argumentos que necessitam da declaração de tipo para chamar o construtor de uma classe genérica com um conjunto vazio de parâmetros de tipo ( <> ). Este par de colchetes é informalmente chamado diamante. | // Considere a seguinte declaração:
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
//Pode-se substituir por tipo parametrizado com o construtor diamante:
Map <String, List <String>> myMap = new HashMap <> (); |
Tipos de Destino:
O tipo de destino de uma expressão é o tipo de dados que o compilador Java espera, dependendo de onde a expressão aparece. | //Java 7
// construtor do método
vazio processStringList (List <String> stringlist)
//chama o método
processStringList (Collections. <String> emptyList ());
//Java 8
// chama o método
processStringList (Collections.emptyList ()); |
A inferência de tipos, introduzida no Java 7, também é aplicada às expressões lambda. | //Exemplo de uso em expressão Lambda
List<String> list = Arrays.asList(...);
Collections.sort(list, (s1, s2) -> s1.length() - s2.length());
//Os tipos dos parâmetros s1 e s2 foram omitidos, o compilador sabe que a lista contém uma coleção de Strings |
Inferência de tipos também se aplica à Funções de Ordem superior | //A implementação é elegante e bem sucinta. Note que faz uso da inferência de tipos: o parâmetro p do tipo Photo não é explicitamente definido.
List<Photo> photos = Arrays.asList(...)
List<Photo> output = photos.filter(p -> p.getSizeInKb() < 10) |