Au niveau de la définition des classes génériques,
le type générique n'est pas très impressionnant,
surtout en connaissant que cette information est présente uniquement dans le code source et elle est perdue une fois le bytecode est généré.
Mais, cette impression va changer en commençant à utiliser le type générique pour déclarer/instancier une classe générique et invoquer ses méthodes génériques :
le compilateur s'en sert pour contrôler et vérifier que le type spécifié lors de l'instanciation est correct partout dans le code où les méthodes génériques de cette classe sont invoquées.
Le type que l'on souhaite utilisé doit être spécifié lors de la déclaration des variables qui référencent la classe générique.
La déclaration est faite de la même façon que la définition de la classe générique : le type doit être placé entre les caractères "
<" et "
>".
Encore une fois, le type générique est présent uniquement dans le code source et il est perdu dans le bytecode :
Le code précédent est considéré, lors de la génération du bytecode, comme s'il a été écrit comme suit :
Le compilateur utilise ce type pour ajouter un cast lors de l'affectation d'une référence de type générique à une variable du type spécifié lors de la déclaration de la classe :
Lors de la génération du bytecode, le code suivant
Number v1 = myGenericClass.getAttr1();
sera remplacé par
Number v1 = (Number) myGenericClass.getAttr1();
.
Notes :
-
Le type spécifié lors de l'instanciation d'une classe doit être exactement le même type utilisé pour la déclaration de la variable qui référence cette classe.
Le compilateur générera une erreur si le type est différent (un sous type est considéré différent) :
Cette restriction s'applique aussi aux valeurs de retour et arguments des méthodes :
La règle générale est la suivante : le compilateur va toujours interdire l'affectation d'une référence à une autre si les types génériques des deux références ne correspondent pas exactement.
-
La règle précédente s'applique uniquement pour l'instanciation des classes et la déclaration des variables et des paramètres qui utilisent explicitement le type générique.
Si l'instanciation des classes et la déclaration des variables et des paramètres n'utilisent pas le type générique,
alors le compilateur ne ferra aucune vérification et ne générera aucune erreur.
Cependant, il affichera un message d'avertissement :
-
Le type spécifié lors de l'invocation des méthodes génériques de la classe peut être le même type ou un sous-type du type spécifié lors de l'instanciation de cette classe :
Le compilateur affichera une erreur si le type spécifié lors de l'invocation des méthodes génériques de la classe est différent du type spécifié lors de l'instanciation de cette classe :