"Bem, finalmente - outra pequena lição sobre genéricos."
"Agora vou lhe dizer como contornar o apagamento de tipo".
"Ah. Isso é algo que eu quero saber."
"Como você provavelmente já sabe, Java tem um tipo Class, que é usado para armazenar uma referência à classe de um objeto. "Aqui estão alguns exemplos:"
Class clazz = Integer.class;
Class clazz = String.class;
Class clazz = "abc".getClass();
"Ah."
"Mas o que você provavelmente não sabe é que também existe uma classe genérica chamada Class. E variáveis de classe genéricas só podem armazenar referências ao tipo determinado pelo argumento de tipo. Aqui estão alguns exemplos:"
Class<Integer> clazz1 = Integer.class; // Everything works well
Class<String> clazz2 = Integer.class; // Compilation error
Class<String> clazz1 = String.class; // Everything works well
Class<String> clazz2 = int.class; // Compilation error
Class<? extends String> clazz1 = "abc".getClass(); // Everything works well
Class<Object> clazz2 = "abc".getClass(); // Compilation error
"Por que funciona assim?"
"Bem, o valor do campo de classe para Integer (ou seja, Integer.class) é na verdade um objeto Class<Integer>."
"Mas vamos continuar."
"Aproveitando o fato de que Class<T> — é um genérico e que esse tipo de variável só pode conter um valor do tipo T, você pode colocá-los juntos de uma maneira elegante como esta:"
class Zoo<T>
{
Class<T> clazz;
ArrayList<T> animals = new ArrayList<T>
Zoo(Class<T> clazz)
{
this.clazz = clazz;
}
public T createNewAnimal()
{
T animal = clazz.newInstance();
animals.add(animal);
return animal
}
}
Zoo<Tiger> zoo = new Zoo<Tiger>(Tiger.class); // This is where we pass the type!
Tiger tiger = zoo.createNewAnimal();
"Esta não é uma manobra muito complicada - estamos simplesmente passando uma referência para o tipo desejado. Mas, se simplesmente usarmos Class em vez de Class<T>, alguém pode acidentalmente passar dois tipos diferentes: um como o argumento T , e outro para o construtor."
"Ah. Eu entendo. Nada sobrenatural aconteceu, mas nada terrível também. Há uma referência ao tipo, e você pode usá-lo. Funciona e isso é bom o suficiente para mim."
"O menino se torna um homem! 'Funciona e isso é bom o suficiente para mim' costuma ser a melhor opção."
"Muitas coisas poderiam ser refeitas em Java agora, mas precisamos manter a compatibilidade com o código antigo."
"As dezenas de milhares de bibliotecas polidas populares são o argumento mais poderoso para Java hoje. Portanto, Java continua sendo a linguagem mais popular por manter a compatibilidade com versões anteriores, portanto não pode introduzir inovações radicais."
"Bem, vou construir meu próprio Java com blackjack e..."
"Tudo bem, já estou cansado do dia. Até a próxima."
"Adeus, Rishi, e obrigado por uma lição tão interessante."
GO TO FULL VERSION