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