web-dev-qa-db-ja.com

「instanceof」の例

public class TableModel2 extends TableModel1 { ... }

TableModel2 tableModel = new TableModel2();

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

上記の例では、t1およびt2trueです。だから、どうすればTableModel1およびTableModel2instanceofを使用しますか?

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

instanceofではできませんが、getClassではできます:

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

instanceof演算子は、クラス階層をJava.lang.Object(すべてのインターフェースのチェックを含む)。クラスキャスト例外をトリガーすることなく、指定した型にオブジェクトのインスタンスをキャストできるかどうかを確認できます。

一方、getClassは、指定されたオブジェクトの特定のクラスを返します。

20
dasblinkenlight

だから、instanceofを使用してTableModel1とTableModel2をどのように区別できますか?

技術的には、tableModelが_TableModel1_およびnotのインスタンスであり、_TableModel2_のインスタンスであることを確認できます。

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

ただし、instanceofまたはgetClass()の結果に基づいて分岐するコードを避けるために、可能な限り強力な用語でお勧めします。このようなコードは、将来の変更に直面すると非常に脆弱です。これらの線に沿って何かをしていることに気付いた場合、デザインを再検討する良い機会になるかもしれないという強力な手がかりです。

7
NPE

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
5
kornero

できません。本当に区別する必要がある場合は、代わりにtableModel.getClass()を使用してください。

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

ただし、OOPの基本原則の1つを意図的に破ろうとしていることに注意してください。したがって、実際のコードで使用する前に、このトリックを回避できないことを確認してください。

4
alf

簡単なクラス名の使用:

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

まあ、私はあなたができるとは思わない。継承の観点からすると、tableModelは両方のタイプに対して完全に有効な参照なので、instanceofは両方の場合にtrueを返します。

1
ŁukaszBachman