1. Compreensão simples de genéricos
Genéricos são um novo recurso do Java SE 1.5. A essência dos genéricos é um tipo parametrizado, o que significa que o tipo de dados que está sendo operado é especificado como um parâmetro. O ponto popular é "variável de tipo". Variáveis deste tipo podem ser utilizadas na criação de classes, interfaces e métodos.
A maneira mais fácil de entender os genéricos Java é pensar neles como uma sintaxe conveniente que economiza algumas operações de conversão de Java:
Copie o código da seguinte forma: List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);
O próprio código acima se expressa de forma muito clara: box é uma lista contendo objetos Apple. O método get retorna uma instância de objeto Apple e nenhuma conversão de tipo é necessária neste processo. Sem genéricos, o código acima precisa ser escrito assim:
Copie o código da seguinte forma: Apple apple = (Apple)box.get(0);
2. O constrangimento dos genéricos
A maior vantagem dos genéricos é que ele fornece segurança de tipo de programa e é compatível com versões anteriores, mas também tem um ponto estranho: o tipo do genérico deve ser especificado toda vez que é definido. para especificá-lo explicitamente, mas também muitos programadores não estão familiarizados com genéricos, então muitas vezes são incapazes de fornecer parâmetros de tipo corretos. Agora o compilador pode inferir automaticamente os tipos de parâmetros dos genéricos, o que pode reduzir tais situações e melhorar o código. legibilidade.
3. Melhorias na inferência de tipos genéricos em Java 7
Nas versões anteriores, ao usar tipos genéricos, era necessário adicionar o tipo genérico em ambos os lados ao declarar e atribuir valores. Por exemplo:
Copie o código da seguinte forma: Map<String, String> myMap = new HashMap<String, String>();
Você pode pensar: já especifiquei o tipo do parâmetro ao declarar a variável, por que preciso especificá-lo novamente ao inicializar o objeto? Felizmente, no Java SE 7, esse método foi aprimorado e agora você pode declarar e atribuir valores usando as seguintes instruções:
Copie o código da seguinte forma: Map<String, String> myMap = new HashMap<>() //Preste atenção no "<>" no final;
Nesta instrução, o compilador inferirá automaticamente o tipo genérico ao instanciar o HashMap com base no tipo genérico quando a variável for declarada. Novamente, certifique-se de prestar atenção ao "<>" após o novo HashMap. Somente adicionar este "<>" significa inferência automática de tipo. Caso contrário, é um HashMap de tipo não genérico e será fornecido ao usar o compilador. compilar o código-fonte.
No entanto: a inferência de tipo do Java SE 7 ao criar instâncias genéricas é limitada: somente se o tipo parametrizado do construtor for explicitamente declarado no contexto, a inferência de tipo poderá ser usada, caso contrário não funcionará. Por exemplo: O exemplo a seguir não pode ser compilado corretamente em Java 7 (mas pode ser compilado em Java 8 agora, porque o tipo do genérico é inferido automaticamente com base nos parâmetros do método):
Copie o código do código da seguinte forma:
Lista<String> lista = new ArrayList<>();
list.add("A");// Como addAll espera um parâmetro do tipo Collection<? extends String>, a instrução a seguir não pode ser passada
list.addAll(new ArrayList<>());
4. Melhorias na inferência de tipos genéricos em Java 8
Existem dois tipos principais de inferência de tipo de destino para genéricos em Java 8:
1. Suporte à inferência de tipos de destino genéricos por meio do contexto do método
2. Suporta a passagem de inferência de tipo genérico para o último método na cadeia de chamadas de método.
Vejamos um exemplo do site oficial:
Copie o código do código da seguinte forma:
lista de classes<E> {
estático <Z> Lista<Z> nil() { ... };
estático <Z> Lista<Z> cons(Z cabeça, Lista<Z> cauda) { ... };
E cabeça() { ... }
}
De acordo com as características do JEP101, podemos escrever assim ao chamar o método acima
Copie o código do código da seguinte forma:
//Inferir automaticamente o tipo do genérico através do parâmetro alvo da atribuição do método
Lista<String> l = List.nil();
//Em vez do tipo especificado exibido
//List<String> l = List.<String>nil();
//Inferir o tipo do genérico através do tipo de parâmetro do método anterior
List.cons(42, List.nil());
//Em vez do tipo especificado exibido
//List.cons(42, List.<Integer>nil());
5. Resumo
O texto acima é o conteúdo de recursos do JEP101. Como representante de linguagens estáticas, pode-se dizer que Java possui um sistema de tipo rico. O problema de conversão entre tipos incomoda todos os programadores Java. Inferir tipos automaticamente por meio do compilador pode aliviar um pouco o problema de conversão de tipos muito complexos. Embora seja uma pequena melhoria, definitivamente terá um grande impacto em nossos programadores que escrevem código todos os dias. Pelo menos eles se sentirão mais felizes ~~ Talvez no Java 9 tenhamos um tipo universal var, como js ou algumas linguagens dinâmicas. de scala são assim ^_^