Une caractéristique importante des types paramétriques est la possibilité d'écrire des algorithmes polymorphes, c'est-à-dire des algorithmes qui opèrent sur une structure de données indépendamment de la valeur de son paramètre, tels que Arrays.sort()
.
Avec les génériques, cela se fait avec des types joker :
<E extends Comparable<E>> void sort(E[]);
Pour être vraiment utile, les types joker nécessitent une capture joker, et cela nécessite la notion de paramètre de type. Rien de tout cela n'était disponible à l'époque où les tableaux ont été ajoutés à Java, et le fait de rendre les tableaux de type référence covariants permettait une manière bien plus simple d'autoriser les algorithmes polymorphes :
void sort(Comparable[]);
Cependant, cette simplicité a ouvert une faille dans le système des types statiques :
String[] strings = {"hello"};
Object[] objects = strings;
objects[0] = 1; // throws ArrayStoreException
exigeant une vérification à l'exécution de chaque accès en écriture à un tableau de type référence.
En bref, la nouvelle approche incarnée par les génériques rend le système de types plus complexe, mais aussi plus sûr sur le plan statique, alors que l'ancienne approche était plus simple et moins sûre sur le plan statique. Les concepteurs du langage ont opté pour l'approche la plus simple, ayant des choses plus importantes à faire que de combler une petite faille dans le système de types qui pose rarement des problèmes. Plus tard, lorsque Java a été établi, et que les besoins urgents ont été pris en charge, ils ont eu les ressources nécessaires pour faire les choses correctement pour les génériques (mais le changer pour les tableaux aurait cassé les programmes Java existants).
1 votes
N'est-ce pas parce que les génériques ont été ajoutés plus tard ?
1 votes
Je pense que la comparaison entre les tableaux et les collections est injuste, les collections utilisent les tableaux en arrière-plan ! !!
6 votes
@EL-conteDe-monteTereBentikh Pas toutes les collections, par exemple
LinkedList
.0 votes
@PaulBellora Je sais que les cartes sont différentes des implémentations de collections, mais j'ai lu dans le SCPJ6 que les collections reposaient généralement sur des tableaux ! !!
0 votes
Parce qu'il n'y a pas d'exception ArrayStoreException lors de l'insertion d'un élément erroné dans la collection alors que le tableau le possède. Ainsi, la collection ne peut trouver cela qu'au moment de la récupération et cela aussi à cause du casting. Ainsi, les génériques assureront la résolution de ce problème.
0 votes
J'ai lu quelque part que même cette décision concernant les tableaux était une mauvaise décision, regrettée plus tard.