MST
星途 面试题库

面试题:Java多态中instanceof在复杂泛型和向下转型场景下的应用

给定如下泛型类和继承结构: ```java class GenericHolder<T> { private T value; public GenericHolder(T value) { this.value = value; } public T getValue() { return value; } } class Shape {} class Circle extends Shape {} class Rectangle extends Shape {} ``` 现在有如下代码: ```java GenericHolder<Shape> holder = new GenericHolder<>(new Circle()); Shape shape = holder.getValue(); // 请在此处通过instanceof判断并进行向下转型,调用Circle类中特有的draw()方法 ``` 假设`draw()`方法是`Circle`类独有的绘图方法。请完成上述代码,并详细阐述在泛型场景下,`instanceof`在向下转型时需要注意的问题以及其作用原理。
19.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
if (shape instanceof Circle) {
    Circle circle = (Circle) shape;
    circle.draw();
}

在泛型场景下instanceof向下转型需注意的问题

  1. 泛型擦除:Java 的泛型是编译时的概念,在运行时会进行类型擦除。这意味着在运行时,GenericHolder<Shape>GenericHolder<Circle> 的实际类型是一样的(都是 GenericHolder)。所以在使用 instanceof 时,不能基于泛型类型参数进行判断,例如不能写 holder.getValue() instanceof GenericHolder<Circle>,因为运行时没有 GenericHolder<Circle> 这种类型,只有 GenericHolder
  2. 实际类型检查instanceof 检查的是对象实际的运行时类型,而不是泛型声明的类型。例如 holder 声明为 GenericHolder<Shape>,但 getValue() 返回的对象实际类型可能是 CircleRectangleinstanceof 就是用于判断实际类型是否是期望的可转型类型。

instanceof 作用原理

instanceof 操作符用于判断对象是否是某个类或其子类的实例。它在运行时检查对象的实际类型信息。当执行 obj instanceof ClassName 时,Java 虚拟机首先获取 obj 的实际运行时类型,然后检查这个类型是否是 ClassNameClassName 的子类(包括直接子类和间接子类)。如果是,则返回 true;否则返回 false。在上述代码中,instanceof 首先判断 shape 实际指向的对象是否是 Circle 类或其子类的实例,若是,则可以安全地向下转型并调用 draw() 方法。