Cela est apparu comme une question que j'ai posée lors d'une interview récemment comme quelque chose que le candidat souhaitait voir ajouté au langage Java. Il est communément identifié comme une douleur que Java n'ait pas de génériques réifiés mais, une fois poussé, le candidat ne pouvait pas vraiment me dire le genre de choses qu'il aurait pu accomplir s'ils étaient là.
Évidemment, comme les types bruts sont autorisés en Java (et les vérifications non sécurisées), il est possible de subvertir les génériques et de se retrouver avec un List<Integer>
qui (par exemple) contient en fait String
s. Cela pourrait clairement être rendu impossible si les informations de type étaient réifiées; mais il doit y avoir plus que ça !
Les gens pourraient-ils publier des exemples de choses qu'ils voudraient vraiment faire , si des génériques réifiés étaient disponibles? Je veux dire, évidemment, vous pouvez obtenir le type de a List
au moment de l'exécution - mais que feriez-vous avec?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
EDIT : Une mise à jour rapide à cela car les réponses semblent principalement préoccupées par la nécessité de passer un Class
comme paramètre (par exemple EnumSet.noneOf(TimeUnit.class)
). Je cherchais davantage quelque chose du genre où ce n'est tout simplement pas possible . Par exemple:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
faudrait ignorer le paramétrage, mais defineClass()
ne le pourrait pas). Et comme nous le savons, les pouvoirs en place sont primordiaux pour la rétrocompatibilité.