Réflexion et types génériques en Java Aladyn 9 Novembre 2007
PLAN Approches. Implémentation de la généricité. Modifications de l’API reflection en JAVA 5. C#: Une autre solution.
Approche1: obtenir un objet Class Java 1.4 Javac -Xlint Java 5
Approche 2: L’instantiation d’un paramètre est impossible B non évaluable NullPointerException
Approche 3: deux problèmes apparents 1. Les listes l1 et l2 partagent le même code 2. L’appel dynamique contourne la paramétrisation
Type erasure: où pourquoi tout disparait Variable de type Plus grande borne ou Object Type paramètre Type régulier avant après
Nouveauté de l’API 1.5: l’interface Type java.lang java.lang.reflect GenericDeclaration getTypeParameters() Type Class<T> getTypeParameters() getGenericType() … ParameterizedType getActualTypeArguments() getOwnerType() getRawType() TypeVariable getBounds() getGenericDeclaration() getName() WildcardType getLowerBounds() getUpperBounds() GenericArrayType getGenericComponentType()
Utilisation d’objets Type: pour l’ajout sécurisé ? Java.util.ArrayList E Java.util.List<T> T Renseignement redondant non récupérable depuis types
ajout sécurisé 2: Type est statique [33,56] Même redondance: Type ne peut être utilisé en dynamique
.NET: un framework reflexif FieldInfo getFields() GetModules() GetTypes() Type Assembly Module GetMethods() MethodeInfo GetConstructor() Constructor Info
C# : génériques ouverts/fermés Assemblage: une seule classe générique Compilateur C# Program List<T> Exécution: Plusieurs classes génériques List<T> Program List<int> List<bool> List<double> Compilateur JIT
Conclusion 1.5 = 1.6 Généricité: un vrai changement, compatibilité croissante conservée. Utilisation statique des objets Type (analyseur de type). En .NET, une instanciation par paramètre générique.