instanceof

Posted by 汤键|兔子队列 on November 18, 2021 禁止转载
本文总共 845 字 · 阅读全文大约需要 3 分钟

简介

  • instanceof 是 Java 的保留关键字
  • 也称为类型比较运算符,因为它将实例与类型进行比较
  • 它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型
  • instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false
  • 说明下:类的实例包含本身的实例,以及所有直接或间接子类的实例
  • instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树,否则会编译错误
  • 基本语法:

示例

  • 首先,我们将创建一个 Round 类:
  • 接下来,我们将创建一个扩展 Round 的 Ring 类:
  • 然后我们可以使用instanceof来检查Ring的实例是否是Round类型:

注意事项

  • 左边的对象实例不能是基础数据类型
  • 左边的对象实例和右边的类不在同一个继承树上是不行的
  • null用instanceof跟任何类型比较时都是false
  • 在 Java 中,每个类都隐式继承自 Object 类;因此,对 Object 类型使用 instanceof 运算符将始终计算为 true

应用场景

  • instanceof一般用于对象类型强制转换
  • 在转换未知对象之前,应始终使用 instanceof 检查
  • 这样做有助于避免运行时出现 ClassCastException
  • Stream API – 在投射之前使用instanceof过滤类型
  • 我们经常使用 Stream 的 map() 方法将 A 类型集合转换为 B 类型集合
  • 如果类型转换是通过类型转换完成的,我们可能需要在执行类型转换之前检查类型以避免 ClassCastException
  • 比如,假设我们有一个 Round 实例流:
  • 如上面的代码所示,roundStream 对象包含两个 Ring 对象和一个 Circle 实例
  • 现在如果我们将 roundStream 转换为 Ring 列表而不检查类型,则会引发 ClassCastException,因为 Circle 不是 Ring:
  • 但是如果我们在 map() 调用之前过滤 Ring 对象,我们将得到预期的列表: