instanceof是什么
instanceof严格说是Java中的双目运算符,用法是:
boolean b = obj instanceof Class;
obj表示一个对象,Class表示一个类或者接口。当obj时Class的一个实例或者子类实例、实现类实例时,返回true。 编译器会检查obj能否被转为Class,不能的话编译直接报错。如果无法判断,则会在运行阶段判断。
一些细节
obj只能是引用类型
obj如果是基本类型,编译报错
obj为null的情况
返回false
instanceof 的原理
Person p1 = new Person();
System.out.println(p1 instanceof String);//编译报错
System.out.println(p1 instanceof List);//false
System.out.println(p1 instanceof List<?>);//false
System.out.println(p1 instanceof List<Person>);//编译报错
为什么 p1 instanceof String 编译不通过,而 p1 instanceof List编译能通过? 通过查看Java语言规范Java SE 8版docs.oracle.com/javase/spec…
看到instanceof的伪代码实现:
boolean result;
if (obj == null) {
result = false;
} else {
try {
T temp = (T) obj; // checkcast
result = true;
} catch (ClassCastException e) {
result = false;
}
}
p1 instanceof String 等价于 (String)p1,明显编译不通过。 p1 instanceof List 等价于(List)p1,编译可以通过。
Class的isInstance()方法
Person p1 = new Person();
Person p2 = new Person();
p1.getClass().isInstance(p2);//true