
634.1/PROGRAMMATION
Généricitéclassesparamétrées
634.1Programmation/P.Daehne1/2Version2.6117.04.2015
Syntaxe
Uneclassepeutêtremunied'unelistedeparamètresformelsdéfinissantlestypesdontelledépend.Les
identificateursformelsdestypespeuventensuiteêtreemployésdansladéfinitiondescomposantsdela
classe,enlieuetplaced'unnomdetypeconstant.
classMyClass0<T0,T1>{
T0a;
voidm(T1x){/*...*/}
T0f(intx){/*...*/}
/*...*/
}//MyClass0
Uneinstanced'unetelleclasseestdéclaréeetcrééeenfournissantlesparamètreseffectifscorrespondants
auxtypesformels:
MyClass0<String,Integer>c0=newMyClass0<String,Integer>();
ouencore:MyClass0<Calendar,Object>c0=newMyClass0<Calendar,Object>();
depuisJava7:MyClass0<String,Integer>c0=newMyClass0<>();
ouencore:MyClass0<Calendar,Object>c0=newMyClass0<>();
L'instancepeutégalementêtrecrééeàl'ancienne:
MyClass0c0=newMyClass0();
MyClass0c1=newMyClass0<String,Integer>();
MyClass0<String,Integer>c2=newMyClass0();
LestroisinstructionscidessusprovoquentlagénérationparlecompilateurdeNotes,soitàcausede
l'instructionellemême,soitàcausedel'emploid'uneméthodedelaclasse.
Lesparamètreseffectifsacceptésparuneclasseparamétréepeuventégalementêtrelimitésàuntype
existantetàsesdescendants(classerivéeouclasseimplantantuneinterface):
classMyClass1<TextendsClasseMere>{/*...*/}
Uneinstanced'unetelleclassedoitêtrecrééeaveccommeparamètreeffectifClasseMereouuneclasse
dérivéedecelleci(ouuneclasseimplantantClasseMere,sicelleciestuneinterface).
Danslecaslarestrictionconcerneplusieursclasseset/ouinterfaces,lasyntaxeest:
classMyClass2<TextendsC0&C1<T>&C2>{/*...*/}
Remarquesurl'instanciation
Iln'estpaspossibledecréerdesinstancesdestypesdéfiniscommeparamètresformels,pasplusqu'iln'est
possibledecréerdesinstancesdetableauxayantdescomposantsdecestypes.
Lacompilationducodecidessous:
classAllocation<T>{
voidm(){
Tt0=newT();
T[]t1=newT[10];
}//m
}//Allocation
produitlesmessagesd'erreur:
Allocation.java:3: unexpected type
found : type parameter T
required: class
T t0 = new T();
^
Allocation.java:4: generic array creation
T[] t1 = new T[10];
^
2
errors
634.1Programmation/P.Daehne2/2Version2.6117.04.2015
Notelorsdelacompilation
Aveclesclassesgénériques,onobtientparfoisunnouveautypedemessaged'avertissementlorsdela
compilation:uneNote.Cemessagenoussignalequ'uneopérationdeconversiondetypeuncheckedou
unsafeestprésentedansnotrecode;lecodeestnéanmoinsgénéré.
Note: OldColl.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Cettesituationsurvientlorsqu'onemploieunparameterizedtypeàl'ancienne,c'estàdirequ'onencrée
uneinstancesanspréciserleoulesparamètreseffectifsdetype.LaJVMconsidèrealorscescomposants
commeétantunrawtype,c'estàdireuntypepourlequelaucuneinformationn'estdisponibleà
l'exécutionetpourlequellesconversionsautomatiquementgénéréesàlacompilationpourraientéchouer.
Encompilantavecl'optionXlint:unchecked,lecompilateurproduitlemessaged'avertissementsuivant:
OldColl.java:27: warning: [unchecked] unchecked call to add(E) as a
member of the raw type java.util.ArrayList
if (!isIn(x)) {c.add(x);}
^
1 warning
Pourquelecompilateursignaledeserreurs(plutôtquedesNotes)lorsd'unmauvaisusagedestypes
paramétrés,ilfautspécifierl'optiondecompilation:Xlint:unchecked.Dèsmaintenant,toutesnos
applicationsserontcompiléesaveccetteoption(dansNetBeans,ilfautspécifiercetteoptiondansles
Propertiesduprojet,compiling).
Ilestpossibleque,danscertainescirconstances,ces«erreurs»soientprévues:
Ilyadescasts(typeguards)nécessairesquinepeuventêtrevérifiésàl’exécution(parceque
l’informationn’existepasdanslebytecode);c’estlecasdestypeguardsavecleparameterizedtype.
Danscecas,lecompilateurproduiraunmessaged’avertissement(etlecodeneserapasgénéré).
L’annotation@SuppressWarnings("unchecked")permetdegérercettesituation.Lorsqu’elle
préfixeuneclasse,uneméthodeouuneinstruction,elleindiquequelecodedelaclasse,méthodeou
instructionesttypeunsafe.
Exemples:
classAllocation<T>{
@SuppressWarnings("unchecked")
voidm(){
T[]t=(T[])newObject[10];
}//m
}//Allocation
classAllocation<T>{
voidm(){
@SuppressWarnings("unchecked")
T[]t=(T[])newObject[10];
}//m
}//Allocation
Exemplesdemiseenoeuvre
Considéronslediagrammedeclassesuivant:
Implantationàl'ancienne:GestionClasseAncien.zip
ImplantationenemployantlaversionparamétréedesclassesdebibliothèqueArrayListet
Iterator: GestionClasseGen.zip
Implantationd'ungroupequelconqued'objets;miseenœuvreavecdesEtudiantsetdesVoitures:
GestionGroupes.zip
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !