Comment obtenir la classe de variable de type dans Java Generics
J'ai vu des questions similaires, mais ils n'ont pas beaucoup aider.
Par exemple j'ai cette Classe Générique:
public class ContainerTest<T>
{
public void doSomething()
{
//I want here to determinate the Class of the type argument (In this case String)
}
}
et une Autre Classe qui utilise cette Classe de Conteneur
public class TestCase
{
private ContainerTest<String> containerTest;
public void someMethod()
{
containerTest.doSomething();
}
}
Est-il possible de déterminer la Classe du type d'argument dans la méthode doSomething() sans avoir un type explicite variable/champ ou tout constructeur dans ContainerTest Classe?
Mise à jour: modification du format de ContainerTest Classe
source d'informationauteur ZeDonDino
Vous devez vous connecter pour publier un commentaire.
C'est le seul moyen de stocker de la classe dans une variable d'instance et d'exiger, comme un argument du constructeur:
Si vous êtes intéressé dans le réflexion façonj'ai trouvé une solution partielle dans cet excellent article: http://www.artima.com/weblogs/viewpost.jsp?thread=208860
En bref, vous pouvez utiliser
java.lang.Class.getGenericSuperclass()
etjava.lang.reflect.ParameterizedType.getActualTypeArguments()
méthodes, mais vous avez une classe de certains parents super classe.L'extrait de code suivant fonctionne pour une classe qui directement étend la super-classe
AbstractUserType
. Voir l'article référencé pour plus de solution générale.Il n'y a pas de manière "propre" pour obtenir de l'argument de Type Générique de l'intérieur de la classe.
Au lieu de cela, un modèle commun est de passer de la Classe de Type Générique, le constructeur et le garder comme un intérieur de la propriété juste comme le fait la java.util.EnumMap mise en œuvre.
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumMap.html
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/EnumMap.java
Pas. Il n'est pas possible en raison de type d'effacement (le type des paramètres sont compilés en tant qu'Objet de type plâtre). Si vous vraiment besoin de savoir/faire respecter le type de runtime vous pouvez stocker une référence à un
Class
objet.Utilisation:
D'apprendre la valeur de
T
vous aurez besoin de le capturer dans une définition de type de sous-classement par ContainerTest:Vous pouvez aussi le faire avec une classe anonyme si vous le souhaitez:
Ensuite pour régler la valeur de T, vous pouvez utiliser Adresse typetools:
Si Vous pouvez définir comme ce
Alors il est possible
Il est un moyen d'obtenir l'exécution type de le type de paramètre à l'aide de la Goyave est
TypeToken
de le capturer. La solution a un inconvénient est que vous devez créer un anonyme sous-classe chaque fois que vous besoin d'une instance deContainer
.La clé de cette solution est décrite dans la JavaDoc de
TypeToken
'constructeur utilisé dans le code ci-dessus: