注:obj 操作数的类型必须是引用类型或空类型,否则,发生编译时错误。
代码:
boolean rs; if (obj == null) { rs= false; } else { try { T temp = (T) obj; rs= true; } catch (ClassCastException e) { rs = false; } } return rs; obj==null,返回false;如果 obj 强制转换为 T 时发生编译错误,返回false。运行时,如果 T != null,并且 (T) obj 不引发ClassCastException,返回true。如果 obj != null 并且 (T) obj 不引发 ClassCastException ,返回 true ,否则值为 false 。总结:obj==null,返回false; (T) obj 不引发ClassCastException,返回true,否则为false;
以上只要有一个成立,S就是T的子类型 否则 S不是T的子类型。那么就无法强制转换,会产生ClassCastException。
类所继承的超类和所实现的接口不会在运行时改变。 -> 可以将这些信息存储起来
类继承深度从0到7的超类叫做“主要超类型”(primary super)->存于长度为8的缓存数组。
把所有其它超类型(接口、数组相关以及超过深度7的超类)叫做“次要超类型”(secondary super),存于一个数组(在初始化数组时分情况按顺序填好)。
不用遍历继承链等(性能差)
直接根据情况遍历主要超类型数组根据情况获取指定下标,从指定下标遍历次要超类型数组