public class TableModel2 extends TableModel1 { ... }
TableModel2 tableModel = new TableModel2();
boolean t1 = tableModel instanceof TableModel1;
boolean t2 = tableModel instanceof TableModel2;
上記の例では、t1
およびt2
はtrue
です。だから、どうすればTableModel1
およびTableModel2
instanceof
を使用しますか?
boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True
instanceof
ではできませんが、getClass
ではできます:
boolean t1 = tableModel.getClass().equals(TableModel1.class);
boolean t2 = tableModel.getClass().equals(TableModel2.class);
instanceof
演算子は、クラス階層をJava.lang.Object
(すべてのインターフェースのチェックを含む)。クラスキャスト例外をトリガーすることなく、指定した型にオブジェクトのインスタンスをキャストできるかどうかを確認できます。
一方、getClass
は、指定されたオブジェクトの特定のクラスを返します。
だから、instanceofを使用してTableModel1とTableModel2をどのように区別できますか?
技術的には、tableModel
が_TableModel1
_およびnotのインスタンスであり、_TableModel2
_のインスタンスであることを確認できます。
_(tableModel instanceof TableModel1) && !(tableModel instanceof TableModel2)
_
ただし、instanceof
またはgetClass()
の結果に基づいて分岐するコードを避けるために、可能な限り強力な用語でお勧めします。このようなコードは、将来の変更に直面すると非常に脆弱です。これらの線に沿って何かをしていることに気付いた場合、デザインを再検討する良い機会になるかもしれないという強力な手がかりです。
instance ofは「is a」を意味します。
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
できません。本当に区別する必要がある場合は、代わりにtableModel.getClass()
を使用してください。
boolean t1 = tableModel.getClass() == TableModel1.class;
boolean t2 = tableModel.getClass() == TableModel2.class;
ただし、OOPの基本原則の1つを意図的に破ろうとしていることに注意してください。したがって、実際のコードで使用する前に、このトリックを回避できないことを確認してください。
簡単なクラス名の使用:
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));
}
}
まあ、私はあなたができるとは思わない。継承の観点からすると、tableModel
は両方のタイプに対して完全に有効な参照なので、instanceof
は両方の場合にtrueを返します。