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
?
boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True
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é.
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.
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
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.
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));
}
}
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.