在查询类型信息时,以instanceof的形式(即以instanceof的形式,它们产生相同的结果)与直接比较Class对象有一个很重要的差别。下面的例子展示了这种差别:
//: typeinfo/FamilyVsExactType.java
// The difference between instanceof and class
package typeinfo;
import static net.mindview.util.Print.*;
class base {}
class Derived extends base {}
public class FamilyVsExactType {
static void test(Object x) {
print(“Testing x of type” + x.getClass());
print(“x instanceof base” + (x instanceof base));
print(“base.isInstance(x)” + base.class.isInstance(x));
print(“Derived.isInstance(x)” + Derived.class.isInstance(x));
print(“x.getClass() == base.class” + (x.getClass() == base.class));
print(“x.getClass() == Derived.class” + (x.getClass() == Derived.class));
print(“x.getClass().equals(base.class))” + (x.getClass().equals(base.class)));
}
public static void main(String[] args) {
test(new base());
test(new Derived());
}
}//:~
test()方法使用了两种形式的instanceof作为参数来执行类型检查。然后获取Class引用,并用和equals()来检查Class对象是否相等。使人放心的是,instanceof和isInstance()生成的结果完全一样,equals()和也是一样。但是这两组测试得出的结论却不相同。instanceof保持了类型的概念,它指的是“你是这个类吗,或者你是这个类的派生类吗?”而如果用==比较实际的Class对象,就没有考虑继承——它或者是这个确切的类型,或者不是。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)