Convertir java.lang.de réfléchir.Type de Classe<T> clazz
Comment puis-je convertir java.lang.reflect.Type
à Class<T> clazz
?
Si j'en ai une méthode comme la suivante, ce qui est un argument de Class<T>
:
public void oneMethod(Class<T> clazz) {
//Impl
}
Puis une autre méthode qui a un argument de java.lang.reflect.Type
et il appelle oneMethod(Class<T> clazz)
et pour cela j'ai besoin de convertir java.lang.reflect.Type type
à Class<T>
:
public void someMehtod(java.lang.reflect.Type type) {
//I want to pass type arg to other method converted in Class<T>
otherMethod(¿How to convert java.lang.reflect.Type to Class<T>?);
}
Est-il possible?
OriginalL'auteur Pau | 2016-08-04
Vous devez vous connecter pour publier un commentaire.
Vous devez vous assurer que
type
est une instance deClass
, puis le jeter.Bien sûr, vous devez également gérer le cas de ne pas être un
Class
.OriginalL'auteur Andy Turner
Il serait bizarre qu'un
Type
serait rien d'autre qu'unClass
... Javadoc pourType
ditDonc, sauf si vous avez des bibliothèques qui utilisent non
Class
Type
s, vous pouvez tout simplement jeté - mais vous devez être prêt pour une éventuelleClassCastException
.Attention: Java utiliser sans papiers Type de mise en œuvre de représenter les génériques, voir ci-dessous.
Vous pouvez explicitement les traiter ou pas parce que c'est un décoché exception:
Manière explicite:
Manière implicite:
mais la méthode actuelle pourrait jeter...
ÉDITION par @Andy Turner commentaire:
Attention:
Type type = new ArrayList<String>().getClass().getGenericSuperclass();
rendements quelque chose qui est un Type, mais pas une Classe. Celui-ci est unParameterizedType
, de sorte que vous pouvez utilisergetRawType()
méthode pour trouver la classe réelle, mais d'autres peuvent exister.Type type = new ArrayList<String>().getClass().getGenericSuperclass();
rendements quelque chose qui est unType
mais pas unClass
. Ideone démo.vous avez raison, c'est un sans-papiers de la classe... On doit deviner qu'elle met en œuvre
ParameterizedType
et ensuite utilisergetRawType()
pour trouver une vraie Classe.C'est le point.
Type
peut être une instance deClass
, ou il peut être une instance deParameterizedType
,TypeVariable
,WildcardType
, ouGenericArrayType
. Le dernier 4 sont des interfaces; la mise en œuvre de la classe n'est pas pertinent.N'oubliez pas:
All Known Subinterfaces: GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType
Aussi n'oubliez pas que vous pouvez anonymement implémenter une interface de n'importe où -- de sorte qu'il peut en fait être beaucoup de classes qui implémentent ces interfaces. Dans la pratique, d'autres implémentations de Type sont obtenus en appelant par exemplefield.getGenericType()
.OriginalL'auteur Serge Ballesta
Andy Turner réponse est correcte, mais si vous avez besoin de récupérer une classe à partir d'un paramètre de type, c'est un exemple complet:
OriginalL'auteur xonya
Si vous êtes prêt à utiliser une bibliothèque, vous pouvez utiliser
com.google.guava:guava:12+
:Sinon vous pouvez aussi utiliser
com.fasterxml.jackson.core:jackson-databind:2.8.x
:Cela gère tous les cas correctement et vous obtiendrez le type effacé de la classe de votre type.
OriginalL'auteur Daniel Beer
Vouliez-vous dire cela?
OriginalL'auteur Claudio Zesiger