96 votes

Test si l'objet est une instance d'un type de paramètre

Existe-t-il un moyen de déterminer si un objet est une instance d'un type générique ?

public <T> test(Object obj) {
    if (obj instanceof T) {
        ...
    }
}

C'est clair que ça ne marche pas. Existe-t-il une alternative ? Par exemple, je veux utiliser la réflexion Java pour instancier une classe et vérifier qu'elle est de type générique. T .

140voto

Mark Peters Points 42201

La seule façon d'effectuer cette vérification est de disposer de l'option Class représentant le type :

Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
   //...
}

0 votes

Si tu ne veux pas type en tant que paramètre de méthode, vous voulez peut-être l'initialiser : Class type = ((T) new Object()).getClass();

10 votes

@JordiVilaplana Ce n'est pas correct, cela vous donnera java.lang.Object comme classe. Vérifiez ceci : ideone.com/bxt9Jq

3 votes

Utilisez : Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[‌​0];

26voto

Puce Points 13540

Pour étendre l'échantillon de Mark Peters, souvent vous voulez faire quelque chose comme :

Class<T> type; //maybe passed to the method
if ( type.isInstance(obj) ) {
   T t = type.cast(obj);
   // ...
}

13voto

Ton Snoei Points 51

Si vous ne voulez pas passer le type de classe comme paramètre comme mentionné par Mark Peters, vous pouvez utiliser le code suivant. Félicitations à David O'Meara.

  Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
                  .getActualTypeArguments()[0];
  if (type.isInstance(obj)) {
      ...
  }

6voto

Vous pouvez essayer ceci,

// 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....
}

3voto

Chris Dennett Points 12396

Il serait plus logique de mettre la restriction sur l'endroit où le type T est utilisé pour paramétrer le Class type. Lorsque vous passez le type, au lieu d'utiliser quelque chose comme Class<?> vous devez utiliser Class<? extends T> .

1 votes

Si vous voulez connaître le type exact de T à l'exécution, il est important d'exiger que l'appelant passe une Class<T>, et non une Class< ? extends T>. Par exemple, le code de Puce ne compilerait pas avec une Class< ? extends T>.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X