Bonjour,
j'aimerais faire quelque chose du style
mais ça n'est pas possible directement. Existe-t-il un moyen de contourner ce problème ? par reflection ?Code:
1
2
3
4
5 class C<T> { T makeT() { return new T(); } }
Merci.
Version imprimable
Bonjour,
j'aimerais faire quelque chose du style
mais ça n'est pas possible directement. Existe-t-il un moyen de contourner ce problème ? par reflection ?Code:
1
2
3
4
5 class C<T> { T makeT() { return new T(); } }
Merci.
Salut,
Tu es obligé de te trimballer le type associé à chaque instance, par exemple :
Que tu utilises comme cela :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class C<T> { private final Class<T> type; public C(Class<T> type) { this.type = type; if (type==null) throw new NullPointerException("type is null"); } T makeT() { try { return this.type.newInstance(); } catch (Exception e) { throw new UnsupportedOperationException("Cannot create instance", e); } } }
Code:C<Integer> = new C<Integer>(Integer.class);
Tu pourrais éventuellement utiliser une méthode statique pour l'instanciation :
Cela te permet d'éviter les doublons de déclaration des types :Code:
1
2
3 public static <E> C<E> forType(Class<E> type) { return new C<E>(type); }
Code:C<Integer> = C.forType(Integer.class);
Plus d'info : Les Generics ne sont pas des Templates comme les autres !
a++
Ah génial merci pour la solution :king:
Et puis merci aussi pour le document, je quelque chose du type parce que je viens du C++ :P