"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:"

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:"

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:"

Exemplo
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
 }
}
Uso
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."