目录
简介
示例
注意事项
应用场景
简介
- 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 对象,我们将得到预期的列表: