2 votes

Problème avec "instanceof" avec une classe externe générique

Le code suivant ne compile pas :

class OuterClass {

    class BaseClass { }

    class SubClass extends BaseClass { }

    public void test(BaseClass myObject) {
        boolean b = (myObject instanceof SubClass);
    }
}

Le message d'erreur sur la méthode test() est : "Impossible d'exécuter une vérification d'instance sur un type paramétré MyOuterClass.MySubClass. Utilisez la forme MySubClass car les informations supplémentaires sur le type générique seront effacées à l'exécution"

Alors comment puis-je déterminer si la variable est de type BaseClass ? J'ai essayé toutes les options suivantes et elles ne fonctionnent pas :

boolean b1 = (myObject instanceof SubClass);
boolean b2 = (myObject instanceof SubClass);
boolean b3 = (myObject instanceof SubClass);
boolean b4 = (myObject instanceof OuterClass.SubClass);
boolean b5 = (myObject instanceof OuterClass.SubClass);
boolean b6 = (myObject instanceof OuterClass.SubClass);
boolean b7 = (myObject instanceof OuterClass.SubClass);
boolean b8 = (myObject instanceof OuterClass.SubClass);

Je pense que ce problème est indépendant de la version de la JVM, mais juste au cas où, j'utilise la version 1.6.0_22-b04 de Sun.

2voto

Dan R. Points 556

Ceci n'est qu'une réponse partielle, mais si nous modifions l'exemple comme suit, il compile :

classe OuterClass {

    classe InnerClass { }

    public void test(Object monObjet) {
        boolean b1 = (monObjet instanceof OuterClass.InnerClass);     // Fonctionne
        boolean b2 = (monObjet instanceof OuterClass.InnerClass);  // Fonctionne également
    }
}

1voto

Nulldevice Points 1205

Votre code pour b4 est correct. Au moins pour 1.6.0_23.

class OuterClass {

    class BaseClass { }

    class SubClass extends BaseClass { }

    public void test(BaseClass myObject) {
        boolean b = (myObject instanceof OuterClass.SubClass);
        System.out.println(b);
    }

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.BaseClass b = outerClass.new BaseClass();
        OuterClass.SubClass s = outerClass.new SubClass();
        outerClass.test(b);
        outerClass.test(s);
    }
}

Output:

false
true

Version de Java:

java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)

1voto

gnat Points 5565

Se remémorant une expérience douloureuse de traque de bogues subtils liés aux classes internes nommées non statiques, je n'ai pas pu résister à voir ce qui se passerait si je les rendais statiques...

class OuterClass {

    static class BaseClass { }

    static class SubClass extends BaseClass { }

    public void test(BaseClass myObject) {
        boolean b = (myObject instanceof SubClass);
    }
}

...et voilà ! les erreurs du compilateur ont disparu

0voto

Dan R. Points 556

Merci à highlycaffeinated et Nulldevice d'avoir souligné que b4 et b6 sont corrects.

J'ai découvert qu'il s'agissait d'un bug dans la version d'Eclipse que j'utilisais. (J'utilisais Ganymede, et cela a été corrigé lorsque j'ai mis à jour vers Helios.)

Juste pour information, je l'ai signalé comme bug Eclipse 353354.

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