/ / pourquoi instanceof ne fonctionne pas avec générique? [dupliquer] - java, génériques, typeerror, instanceof

pourquoi instanceof ne fonctionne pas avec Generic? [duplicate] - Java, génériques, typeerror, instanceof

Duplication possible:
Java: instance 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 <T>List<T> castCollection(List srcList, Class<T> clas){
List<T> list =new ArrayList<T>();
for (Object obj : srcList) {
if(obj instanceof T){
...
}
}
return list;
}

Mais obj instanceof T montrant une erreur de compilation -

Impossible d'effectuer instanceof avec le paramètre de type T. Utilisez plutôt son objet 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. :)

Réponses:

35 pour la réponse № 1

Vous ne pouvez pas le faire de cette façon. Heureusement, vous avez déjà un Class<T> argument donc au lieu

myClass.isAssignableFrom(obj.getClass())

Cela reviendra vrai si obj est de classe myClass ou sous-classe.

Comme @ILMTitan l’a souligné (merci), vous devrez vérifier si obj == null pour éviter une exception NullPointerException potentielle, ou utilisez myClass.isInstance(obj) au lieu. Soit ce dont vous avez besoin.


7 pour la réponse № 2

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.

Au moment de l'exécution, les informations de type sur les types génériques sont supprimées en raison de l'effacement du type mais instanceof est une vérification d'exécution qui nécessite un type concret (et non une variable de type) pour fonctionner.


4 pour la réponse № 3

T est un type paramétré et existe à des fins de compilation. Il n'existe pas au moment de l'exécution en raison de l'effacement du type.

Donc, obj instanceof T n'est pas légal.


4 pour la réponse № 4

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


2 pour la réponse № 5

Les types génériques seront effacé après la compilation (les génériques concernent la sécurité du type de compilation) 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 String