Cela permettrait à la méthode invoke d'avoir le bon type de retour. Par exemple:
Pourquoi la classe de méthode Java n'est-elle pas générique?
class Method<T> {
T invoke(Object obj, Object... args);
}
Cela permettrait à la méthode invoke d'avoir le bon type de retour. Par exemple:
Pourquoi la classe de méthode Java n'est-elle pas générique?
class Method<T> {
T invoke(Object obj, Object... args);
}
En Java, Generics sont disponibles au moment de la compilation. Vous ne pouvez pas déterminer le type générique lors de l'exécution. Cela a permis à l'implémentation des génériques d'être rétrocompatible avec les anciennes versions de la JVM.
Puisque les génériques ne sont disponibles au moment de la compilation, si vous connaissez le type de votre classe, vous n'avez pas besoin d'utiliser la réflexion.
Il aurait été pas déraisonnable de faire Method
générique sur le type de retour effacé. Cependant, ce serait beaucoup d'effort avec peu de gain. La nature de la réflexion est que vous ne connaissez pas les types lors de la compilation - sinon vous pourriez établir un lien statique.
Je suppose que vous pouvez dans certains cas, même ajouter de nouvelles API afin que le type générique est retourné. L'information est toujours sur la méthode, mais pas à partir de l'instance que vous lui passez.
j'allais répondre à quelque chose de similaire, donc au lieu que je vais ajouter ici: Le compilateur Java efface les informations de type sur les génériques à la compilation. Puisque la réflexion est évaluée au moment de l'exécution, toutes les informations de type auront déjà été effacées, ce qui la rendra presque inutile. – Pesto
Ce n'est pas vrai. Voir http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/TypeLiteral.html – robson
Pesto: Il ne supprime pas le type de retour effacé de la méthode! –