面试题答案
一键面试if (shape instanceof Circle) {
Circle circle = (Circle) shape;
circle.draw();
}
在泛型场景下instanceof
向下转型需注意的问题
- 泛型擦除:Java 的泛型是编译时的概念,在运行时会进行类型擦除。这意味着在运行时,
GenericHolder<Shape>
和GenericHolder<Circle>
的实际类型是一样的(都是GenericHolder
)。所以在使用instanceof
时,不能基于泛型类型参数进行判断,例如不能写holder.getValue() instanceof GenericHolder<Circle>
,因为运行时没有GenericHolder<Circle>
这种类型,只有GenericHolder
。 - 实际类型检查:
instanceof
检查的是对象实际的运行时类型,而不是泛型声明的类型。例如holder
声明为GenericHolder<Shape>
,但getValue()
返回的对象实际类型可能是Circle
或Rectangle
,instanceof
就是用于判断实际类型是否是期望的可转型类型。
instanceof
作用原理
instanceof
操作符用于判断对象是否是某个类或其子类的实例。它在运行时检查对象的实际类型信息。当执行 obj instanceof ClassName
时,Java 虚拟机首先获取 obj
的实际运行时类型,然后检查这个类型是否是 ClassName
或 ClassName
的子类(包括直接子类和间接子类)。如果是,则返回 true
;否则返回 false
。在上述代码中,instanceof
首先判断 shape
实际指向的对象是否是 Circle
类或其子类的实例,若是,则可以安全地向下转型并调用 draw()
方法。