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)
在上述例子中,t1和t2是true.那么,我如何区分TableModel1和TableModel2使用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)
那么,我如何使用instanceof来区分TableModel1和TableModel2?
从技术上讲,你可以检查tableModel是一个实例TableModel1和不和的实例TableModel2:
(tableModel instanceof TableModel1) && !(tableModel instanceof TableModel2)
Run Code Online (Sandbox Code Playgroud)
但是,我想以最强烈的措辞鼓励您避免任何基于instanceof或的结果的分支代码getClass().面对未来的变化,这样的代码非常脆弱.如果您发现自己正在沿着这些方向做任何事情,那么这是一个强有力的线索,可能是重新审视您的设计的好时机.
实例手段" 是 ".
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)