n ° Vous êtes en cours d'exécution le problème de la variance générique, qui n'est pas supporté dans .NET sauf de quelques manières très particulières.
Voici la raison: après votre dernière ligne, vous avez un dictionnaire unique avec deux "vues" dessus, efficacement. Maintenant, imaginez que vous avez écrit:
DictA.Add(1, New A())
(Toutes mes excuses si mon VB est légèrement.) Cela a inséré un « non B » dans le dictionnaire, mais DictB pense que toutes les valeurs seront des instances de B.
L'un des principaux objectifs des génériques est d'intercepter les défaillances de type potentielles au moment de la compilation plutôt que le temps d'exécution - ce qui signifie que ce code ne peut pas être compilé, ce qui est précisément dû au manque de variance.
C'est un peu contre-intuitif quand vous êtes habitué à l'héritage normal, mais cela a du sens. Un tas de bananes n'est pas seulement une collection de fruits - c'est une collection de bananes. Java prend une position quelque peu différente à ce sujet en utilisant le caractère générique du côté de l'appelant - il vous laisse voir juste le côté "ajout" du dictionnaire pour DictB, par exemple, tout ce que vous ajoutez à DictB serait bien dans DictA . Les génériques de Java sont très différents des génériques .NET ...