web-dev-qa-db-fra.com

Exemple de «instance de»

public class TableModel2 extends TableModel1 { ... }

TableModel2 tableModel = new TableModel2();

boolean t1 = tableModel instanceof TableModel1;
boolean t2 = tableModel instanceof TableModel2;

Dans l'exemple ci-dessus, t1 et t2 sont true. Alors, comment pourrais-je faire la différence entre TableModel1 et TableModel2 en utilisant instanceof?

20
Klausos Klausos
boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True
18
Mariusz Jamro

Vous ne pouvez pas le faire avec instanceof, mais vous pouvez le faire avec getClass:

boolean t1 = tableModel.getClass().equals(TableModel1.class);
boolean t2 = tableModel.getClass().equals(TableModel2.class);

L'opérateur instanceof est destiné à vérifier la hiérarchie des classes jusqu'à la Java.lang.Object, y compris les vérifications de toutes les interfaces. Il vous permet de savoir si une instance de l'objet que vous avez peut être convertie dans le type que vous avez spécifié sans déclencher d'exception de conversion de classe.

getClass, en revanche, renvoie la classe spécifique de l'objet donné.

20
dasblinkenlight

Alors, comment pourrais-je faire la différence entre TableModel1 et TableModel2 en utilisant instanceof?

Techniquement, vous pouvez vérifier que tableModel est une instance de TableModel1 Et pas et une instance de TableModel2:

(tableModel instanceof TableModel1) && !(tableModel instanceof TableModel2)

Cependant, je voudrais vous encourager dans les termes les plus forts possibles à éviter tout code qui se ramifie en fonction du résultat de instanceof ou getClass(). Ce code est très fragile face aux changements futurs. Si vous vous trouvez à faire quoi que ce soit dans ce sens, c'est un indice fort que cela peut être un bon moment pour revoir votre conception.

7
NPE

instance de signifie "( est un ".

TableModel2 IS A TableModel1.
But TableModel1 IS NOT A TableModel2.
so

package main;

public class TempClass {
    public static void main(String[] args) {
        TableModel1 tableModel1 = new TableModel1();
        TableModel1 tableModel2 = new TableModel2();

        System.out.println(tableModel1 instanceof TableModel1);
        System.out.println(tableModel1 instanceof TableModel2);

        System.out.println(tableModel2 instanceof TableModel1);
        System.out.println(tableModel2 instanceof TableModel2);
    }

    public static class TableModel1 {
    }

    public static class TableModel2 extends TableModel1 {
    }
}

true
false

true
true
5
kornero

Vous ne pouvez pas. Si vous avez vraiment besoin de les différencier, utilisez à la place tableModel.getClass(), comme dans:

boolean t1 = tableModel.getClass() == TableModel1.class;
boolean t2 = tableModel.getClass() == TableModel2.class;

Notez bien que vous essayez délibérément de briser l'un des principes fondateurs de la POO, alors assurez-vous que vous ne pouvez pas éviter cette astuce avant de l'utiliser dans un vrai code.

4
alf

Facile, utilisez des noms de classe:

public class Test
{
    public class TableModel1
    {
    };

    public class TableModel2 extends TableModel1
    {
    };

    public TableModel2 tableModel = new TableModel2();

    public static void main(String[] args)
    {
        Test t = new Test();
        System.out.println("t1=" + t.tableModel.getClass().equals(TableModel1.class));
        System.out.println("t2=" + t.tableModel.getClass().equals(TableModel2.class));
    }
}
1
Fernando Miguélez

Eh bien, je ne pense pas que vous puissiez. Du point de vue de l'héritage, tableModel est une référence parfaitement valide pour les deux types, donc instanceof renverra true dans les deux cas.

1
ŁukaszBachman