Est-il possible de déterminer si un object est une instance de type générique?
public test(Object obj) { if (obj instanceof T) { ... } }
Cela ne fonctionne clairement pas. Y a-t-il une alternative? Comme je veux utiliser la reflection Java pour instancier une classe, puis vérifier qu’elle est de type générique T
La seule façon de procéder est de vérifier si l’object Class
représente le type:
Class type; //maybe passed into the method if ( type.isInstance(obj) ) { //... }
Pour étendre l’échantillon de Mark Peters, vous voulez souvent faire quelque chose comme:
Class type; //maybe passed to the method if ( type.isInstance(obj) ) { T t = type.cast(obj); // ... }
Tu pourrais essayer ça,
// Cast your object to the generic type. T data = null; try { data = (T) obj; } catch (ClassCastException cce) { // Log the error. } // Check if the cast completed successfully. if(data != null) { // whatever.... }
Il serait plus judicieux de définir la ressortingction selon laquelle le type T
est utilisé pour paramétrer le type de Class
. Lorsque vous transmettez le type, au lieu d’utiliser quelque chose comme Class>
, Vous devez utiliser Class extends T>
Class extends T>
.
Si vous ne voulez pas passer le type de classe en tant que paramètre mentionné par Mark Peters, vous pouvez utiliser le code suivant. Félicitations à David O’Meara.
Class type = (Class ) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; if (type.isInstance(obj)) { ... }
Cela ne fonctionnera (en partie) que si vous avez un object de type T. Vous pouvez alors obtenir la classe de cet object, voir java.lang.Class
et rechercher s’il est identique à l’object en question.
Mais notez que cela va à l’encontre de la raison même pour laquelle nous avons un générique: l’utilisation d’un type générique est une manière de dire que vous ne vous souciez pas du type réel (jusqu’aux limites supérieures et inférieures pouvant être spécifiées).