'instanceof'的例子

Kla*_*sos 20 java instanceof

public class TableModel2 extends TableModel1 { ... }

TableModel2 tableModel = new TableModel2();

boolean t1 = tableModel instanceof TableModel1;
boolean t2 = tableModel instanceof TableModel2;
Run Code Online (Sandbox Code Playgroud)

在上述例子中,t1t2true.那么,我如何区分TableModel1TableModel2使用instanceof

das*_*ght 19

你做不到instanceof,但你可以用getClass:

boolean t1 = tableModel.getClass().equals(TableModel1.class);
boolean t2 = tableModel.getClass().equals(TableModel2.class);
Run Code Online (Sandbox Code Playgroud)

instanceof运算符旨在一直检查类层次结构java.lang.Object,包括对所有接口的检查.它可以让您知道您拥有的对象的实例是否可以转换为您指定的类型,而不会触发类转换异常.

getClass另一方面,返回给定对象的特定类.


Mar*_*mro 18

boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 7

那么,我如何使用instanceof来区分TableModel1和TableModel2?

从技术上讲,你可以检查tableModel是一个实例TableModel1和的实例TableModel2:

(tableModel instanceof TableModel1) && !(tableModel instanceof TableModel2)
Run Code Online (Sandbox Code Playgroud)

但是,我想以最强烈的措辞鼓励您避免任何基于instanceof或的结果的分支代码getClass().面对未来的变化,这样的代码非常脆弱.如果您发现自己正在沿着这些方向做任何事情,那么这是一个强有力的线索,可能是重新审视您的设计的好时机.


kor*_*ero 5

实例手段" ".

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
Run Code Online (Sandbox Code Playgroud)