Bonjour,
J'ai une classe AnnotationSet, qui herite de HashSet et qui a pour fonction d'etre au courant du type parametre. Par example, new AnnotationSet<String>().printGenericType() affiche String.
J'ai plusieurs types d'annotations, que j'ai regroupe dans une map(HashMap<Class<?>, AnnotationSet> annotations). Pour ajouter
de type String, j'ai implemente la fonction void addAnnotation(String annotation), qui fonctionne parfaitement (pour l'exemple, elle affiche le type de l'annotation). Mais comme les annotations sont generiques, la fonction pour en ajouter se doit de l'etre egalement, d'ou <T> void addAnnotation(T annotation). Et la, c'est le drame: divorse entre mon AnnotationSet<T> et sont type parametre <T> qui ne se reconnaissent plus
Y-a-t-il une solution a ce pb? Merci
PS: c'est quand meme un peu le bordel les generiques en Java...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 public static void main(String[] args) { HashMap<Class<?>, AnnotationSet> annotations; // [...] some random code addAnnotation(new String("stuff")); // Works fine: displays String addAnnotation(new Integer(1)); // NOT WORKING: displays UndeterminedType } /** * Adds a generic annotation * @Deprecated not working */ public <T> void addAnnotation(T annotation) { if (!annotations.containsKey(annotation.getClass())) annotations.put(annotation.getClass(), new AnnotationSet<T>(this) {}); // Notice the trivial anonymous class annotations.get(annotation.getClass()).add(annotation); annotations.get(go.getClass()).printGenericType(); } /** * Add an annotation of type String */ public void addAnnotation(String annotation) { if (!annotations.containsKey(annotation.getClass())) annotations.put(annotation.getClass(), new AnnotationSet<String>(this) {}); // Notice the trivial anonymous class annotations.get(annotation.getClass()).add(annotation); annotations.get(go.getClass()).printGenericType(); } public class AnnotationSet<T> extends HashSet<T> { /** To keep track of the parameterized type */ private Class<?> genericType; /** Object being annotated */ private Object parent = null; /** * Class constructor. * * @param parent Object being annotated */ public AnnotationSet(WarehouseObject parent) { super(); this.parent = parent; // From http://www.artima.com/weblogs/viewpost.jsp?thread=208860 // this.genericType now contains the Class T this.genericType = ReflectionUtils.getTypeArguments(AnnotationSet.class, getClass()).get(0); } public void printGenericType() { try { System.out.println(genericType.getSimpleName()); } catch (Exception e) { System.out.println("UndeterminedType"); } } } // eo AnnotationSet
Partager