Tester si l’object est une instance d’un type de paramètre

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 Class .

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).