"Eh bien, enfin - une autre petite leçon sur les génériques."

"Maintenant, je vais vous dire comment contourner l'effacement de type."

"Ah. C'est quelque chose que je veux savoir."

"Comme vous le savez probablement déjà, Java a un type Class, qui est utilisé pour stocker une référence à la classe d'un objet. "Voici quelques exemples :"

Exemples
Class clazz = Integer.class;
Class clazz = String.class;
Class clazz = "abc".getClass();

"Ah."

"Mais ce que vous ne savez probablement pas, c'est qu'il existe également une classe générique appelée Class. Et les variables de classe génériques ne peuvent stocker que des références au type déterminé par l'argument type.  Voici quelques exemples :"

Exemples
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

"Pourquoi ça marche comme ça ?"

"Eh bien, la valeur du champ de classe pour Integer (c'est-à-dire Integer.class) est en fait un objet Class<Integer>."

"Mais continuons."

"En profitant du fait que Class<T> — est un générique et que ce type de variable ne peut contenir qu'une valeur de type T, vous pouvez les assembler d'une manière astucieuse comme ceci :"

Exemple
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
 }
}
Usage
Zoo<Tiger> zoo = new Zoo<Tiger>(Tiger.class); // This is where we pass the type!
Tiger tiger = zoo.createNewAnimal();

"Ce n'est pas une manœuvre super délicate - nous passons simplement une référence au type souhaité. Mais, si nous utilisions simplement Class au lieu de Class<T>, alors quelqu'un pourrait accidentellement passer deux types différents : un comme argument T , et un autre au constructeur."

"Ah. Je comprends. Rien de surnaturel ne s'est produit, mais rien de terrible non plus. Il y a une référence au type, et tu peux l'utiliser. Ça marche et ça me suffit."

"Le garçon devient un homme ! 'Ça marche et ça me suffit' est souvent la meilleure option."

"Beaucoup de choses pourraient être refaites en Java maintenant, mais nous devons maintenir la compatibilité avec l'ancien code."

"Les dizaines de milliers de bibliothèques raffinées populaires sont l'argument le plus puissant pour Java aujourd'hui. Ainsi, Java reste le langage le plus populaire en maintenant la compatibilité descendante, il ne peut donc pas introduire d'innovations radicales."

"Eh bien, je vais construire mon propre Java avec le blackjack et…"

"Bien, je suis déjà fatigué de la journée. Jusqu'à la prochaine fois."

"Au revoir, Rishi, et merci pour cette leçon si intéressante."