"Tja, äntligen - ännu en liten lektion om generika."

"Nu ska jag berätta hur du kommer runt typradering."

"Ah. Det är något jag vill veta."

"Som du säkert redan vet har Java en klasstyp, som används för att lagra en referens till ett objekts klass. "Här är några exempel:"

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

"Ah."

"Men vad du förmodligen inte vet är att det också finns en generisk klass som heter Class. Och generiska klassvariabler kan bara lagra referenser till den typ som bestäms av typargumentet.  Här är några exempel:"

Exempel
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

"Varför fungerar det så?"

"Tja, värdet på klassfältet för Integer (dvs. Integer.class) är faktiskt ett Class<Integer>-objekt."

"Men låt oss fortsätta."

"Genom att dra fördel av det faktum att Class<T> - är en generisk och att denna typ av variabel bara kan hålla ett värde av typ T, kan du sätta ihop dem på ett smart sätt så här:"

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

"Det här är inte en superknepig manöver - vi skickar helt enkelt en referens till den önskade typen. Men om vi helt enkelt använde klass istället för klass<T>, kan någon av misstag skicka två olika typer: en som T-argumentet , och en annan till konstruktören."

"Ah. Jag förstår. Inget övernaturligt har hänt, men inget hemskt heller. Det finns en referens till typen, och du kan använda den. Det fungerar och det är bra nog för mig."

"Pojken blir en man! "Det fungerar och det är bra nog för mig" är ofta det bästa alternativet."

"Många saker skulle kunna göras om i Java nu, men vi måste behålla kompatibiliteten med gammal kod."

"De tiotusentals populära polerade biblioteken är det mest kraftfulla argumentet för Java idag. Sålunda förblir Java det mest populära språket genom att upprätthålla bakåtkompatibilitet, så det kan inte introducera radikala innovationer."

"Tja, jag ska bygga min egen Java med blackjack och..."

"Okej, jag är redan trött från dagen. Tills nästa gång."

"Adjö, Rishi, och tack för en så intressant lektion."