— Ei bine, în sfârșit, o altă mică lecție despre generice.

„Acum o să-ți spun cum să ocoliți ștergerea tipurilor”.

— Ah. Asta e ceva ce vreau să știu.

„După cum probabil știți deja, Java are un tip Class, care este folosit pentru a stoca o referință la clasa unui obiect. „Iată câteva exemple:”

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

"Ah."

"Dar ceea ce probabil nu știți este că există și o clasă generică numită Class. Iar variabilele generice Class pot stoca doar referințe la tipul determinat de argumentul tip.  Iată câteva exemple:"

Exemple
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

— De ce funcționează așa?

„Ei bine, valoarea câmpului de clasă pentru Integer (adică Integer.class) este de fapt un obiect Class<Integer>.”

— Dar hai să continuăm.

„Profitând de faptul că Class<T> — este un generic și că acest tip de variabilă poate deține doar o valoare de tip T, le puteți pune împreună într-un mod elegant ca acesta:”

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

„Aceasta nu este o manevră super complicată – pur și simplu transmitem o referință la tipul dorit. Dar, dacă pur și simplu am folosit Class în loc de Class<T>, atunci cineva ar putea trece accidental două tipuri diferite: unul ca argument T , iar altul constructorului."

"Ah. Înțeleg. Nu s-a întâmplat nimic supranatural, dar nici nimic îngrozitor. Există o referire la tip și o poți folosi. Funcționează și asta e suficient de bun pentru mine."

„Băiatul devine bărbat! „Funcționează și asta e suficient de bun pentru mine” este adesea cea mai bună opțiune.”

„O mulțime de lucruri ar putea fi refăcute în Java acum, dar trebuie să menținem compatibilitatea cu codul vechi.”

„Zecile de mii de biblioteci populare șlefuite sunt cel mai puternic argument pentru Java astăzi. Astfel, Java rămâne cel mai popular limbaj, menținând compatibilitatea cu versiunea anterioară, deci nu poate introduce inovații radicale.”

„Ei bine, o să-mi construiesc propriul Java cu blackjack și...”

"Bine, sunt deja obosit de la zi. Până data viitoare."

"La revedere, Rishi, și mulțumesc pentru o lecție atât de interesantă."