pourquoi instanceof ne fonctionne pas avec générique?

Dupliquer possible:
Java: Instance de et génériques

J’essaie d’écrire une fonction qui transforme une liste générique en un type spécifique, List. Trouvez le code ci-dessous

public List castCollection(List srcList, Class clas){ List list =new ArrayList(); for (Object obj : srcList) { if(obj instanceof T){ ... } } return list; } 

Mais obj instanceof T montrant une erreur de compilation –

Impossible d’effectuer une vérification d’instance contre le paramètre de type T. Utilisez plutôt son object d’effacement>, car d’autres informations de type génériques seront effacées lors de l’exécution.

une clarification ou un moyen d’obtenir le résultat souhaité?

Merci d’avance. 🙂

Vous ne pouvez pas le faire de cette façon. Heureusement, vous avez déjà un argument de Class .

 myClass.isAssignableFrom(obj.getClass()) 

Cela retournera true si obj est de la classe myClass ou de la sous-classe.

Comme @ILMTitan l’a fait remarquer (merci), vous devrez rechercher obj == null pour éviter une éventuelle NullPointerException ou utiliser myClass.isInstance(obj) place. Soit ce dont vous avez besoin.

Réponse courte: parce qu’un paramètre de type en Java est quelque chose que le compilateur utilise juste pour garantir la sécurité du type.

Lors de l’exécution, les informations de type sur les types génériques sont ignorées en raison de l’effacement de type, mais instanceof est une vérification à l’exécution qui nécessite un type concret (et non une variable de type) pour fonctionner.

T est un type paramétré et existe pour la compilation. Il n’existe pas au moment de l’exécution en raison de l’effacement du type.

Par conséquent, obj instanceof T n’est pas légal.

Comme java utilise l’effacement, les types génériques ne peuvent pas être utilisés pour vérifier.

Pour obtenir le résultat souhaité, utilisez Class.isInstance() .

Les types génériques seront effacés après la compilation (les génériques sont destinés à la compilation du type sécurité) et seront remplacés par le type le plus applicable après la compilation.

Si vous voulez faire cette compilation, remplacez T par un type concret, exemple

 obj instance Ssortingng