52 votes

Impossible d'effectuer une vérification d'instanceof contre le type paramétré ArrayList<Foo>.

Le code suivant :

((tempVar instanceof ArrayList<Foo>) ? tempVar : null);

causes :

Impossible d'effectuer instanceof vérification par rapport au type paramétré ArrayList<Foo> . Utilisez le formulaire ArrayList<?> à la place, car les informations supplémentaires sur les types génériques seront effacées au moment de l'exécution.

Quelqu'un peut-il m'expliquer ce que signifie "les autres informations sur les types génériques seront effacées au moment de l'exécution" et comment résoudre ce problème ?

55voto

Buhake Sindi Points 38654

Cela signifie que si vous avez quelque chose qui est paramétré, par ex. List<Foo> fooList = new ArrayList<Foo>(); l'information Generics sera effacée au moment de l'exécution. À la place, voici ce que la JVM verra List fooList = new ArrayList(); .

C'est ce qu'on appelle effacement de type . La JVM ne dispose pas d'informations sur les types paramétrés de l'objet List (dans l'exemple) pendant l'exécution.

Une solution ? Puisque la JVM n'a aucune information sur le type paramétré au moment de l'exécution, il n'y a aucun moyen de faire un instanceof de ArrayList<Foo> . Vous pouvez "stocker" le type paramétré de manière explicite et y effectuer une comparaison.

26voto

Greg Points 78

Vous pouvez toujours faire ceci à la place

try
{
    if(obj instanceof ArrayList<?>)
    {
        if(((ArrayList<?>)obj).get(0) instanceof MyObject)
        {
            // do stuff
        }
    }
}
catch(NullPointerException e)
{
    e.printStackTrace();
}

10voto

Paul Bellora Points 26524

En raison de l'effacement du type, le type paramétré de l'élément ArrayList ne sera pas connu au moment de l'exécution. Le mieux que vous puissiez faire avec instanceof est de vérifier si tempVar est un ArrayList (de quoi que ce soit). Pour faire cela de manière conviviale, utilisez :

((tempVar instanceof ArrayList<?>) ? tempVar : null);

1voto

flob Points 1036

Tu ne peux pas réparer ça. Les informations de type pour les génériques ne sont pas disponibles au moment de l'exécution et vous n'y aurez pas accès. Vous pouvez seulement vérifier le contenu du tableau.

1voto

deeKay Points 132

L'opérateur instanceof fonctionne au moment de l'exécution. Mais java ne porte pas les informations sur les types paramétrés au moment de l'exécution. Elles sont effacées au moment de la compilation. D'où l'erreur.

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