'instanceof'的例子

时间:2012-02-07 10:54:15

标签: java instanceof

public class TableModel2 extends TableModel1 { ... }

TableModel2 tableModel = new TableModel2();

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

在上面的示例中,t1t2true。那么,我如何使用TableModel1区分TableModel2instanceof

7 个答案:

答案 0 :(得分:20)

您无法使用instanceof执行此操作,但可以使用getClass执行此操作:

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

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

另一方面,

getClass返回给定对象的特定类。

答案 1 :(得分:17)

boolean t2 = tableModel.getClass().equals(TableModel1.class); //False
boolean t2 = tableModel.getClass().equals(TableModel2.class); //True

答案 2 :(得分:7)

  

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

从技术上讲,您可以检查tableModelTableModel1不是的实例以及TableModel2的实例:

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

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

答案 3 :(得分: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

答案 4 :(得分:4)

你做不到。如果您确实需要彼此分辨,请改用tableModel.getClass(),如:

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

请注意,虽然您故意试图破坏OOP的基本原则之一,但请确保在真实代码中使用它之前无法避免这种技巧。

答案 5 :(得分:1)

好吧,我不相信你能。从继承角度来看,tableModel是两种类型的完全有效的引用,因此instanceof在两种情况下都将返回true。

答案 6 :(得分: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));
    }
}