Una caratteristica importante dei tipi parametrici è la capacità di scrivere algoritmi polimorfici, ovvero algoritmi che operano su una struttura di dati indipendentemente dal suo valore di parametro, come Arrays.sort()
.
Con generics, questo viene fatto con i tipi di caratteri jolly:
<E extends Comparable<E>> void sort(E[]);
Per essere veramente utili, i tipi di caratteri jolly richiedono l'acquisizione di caratteri jolly e ciò richiede la nozione di un parametro di tipo. Nulla di tutto ciò era disponibile al momento dell'aggiunta di matrici a Java e matrici di tipo covariante di tipo di riferimento consentivano un modo molto più semplice per consentire algoritmi polimorfici:
void sort(Comparable[]);
Tuttavia, quella semplicità ha aperto una lacuna nel sistema di tipo statico:
String[] strings = {"hello"};
Object[] objects = strings;
objects[0] = 1; // throws ArrayStoreException
che richiede un controllo di runtime di ogni accesso in scrittura a una matrice di tipo di riferimento.
In breve, l'approccio più nuovo incarnato dai generici rende il sistema di tipi più complesso, ma anche più staticamente sicuro, mentre l'approccio più vecchio era più semplice e meno staticamente sicuro. I progettisti del linguaggio hanno optato per un approccio più semplice, avendo cose più importanti da fare rispetto alla chiusura di una piccola lacuna nel sistema di tipi che raramente causa problemi. Più tardi, quando fu creato Java, e le esigenze urgenti prese in carico, avevano le risorse per farlo nel modo giusto per i generici (ma cambiarlo per array avrebbe rotto i programmi Java esistenti).