必须先用 instanceof 判断再向下转型,否则对象实际类型不匹配时会抛 classcastexception;instanceof 运行时安全返回布尔值,可提前规避异常,且对 null 返回 false、不抛 npe。

用 instanceof 判断对象实际类型,再安全执行向下转型,是避免 ClassCastException 的标准做法。
为什么要先判断再强转
向下转型(如把 Object 转成 String 或自定义子类)有风险:如果对象实际不是目标类型,运行时直接抛出 ClassCastException。而 instanceof 在编译期不检查,但运行时能安全判断对象是否属于某类或其实现的接口,返回 true 或 false,从而让程序有机会跳过非法转换。
基本写法:先判后转
- 语法结构固定:
if (obj instanceof TargetType) { TargetType t = (TargetType) obj; } -
instanceof左侧必须是非空引用(null 时结果恒为 false,不会 NPE) - 右侧只能是类、接口、或带泛型擦除后的原始类型(如
List可以,List<string></string>不合法) - 转型语句必须放在
if块内,确保只在类型匹配时执行
常见易错点提醒
- 不要对基本类型使用
instanceof(如int、boolean),它只适用于引用类型 - 父类引用指向子类对象时才能成功(多态前提),比如
Animal a = new Dog(); a instanceof Dog是 true - 转型目标类型必须和
instanceof右侧一致,否则逻辑矛盾(例如判instanceof String却转成Integer) - JDK 14+ 支持模式匹配语法:
if (obj instanceof String s) { /* s 已自动强转并可用 */ },更简洁安全
结合业务场景的实用建议
- 处理集合中混存多种类型时(如
List<object></object>),遍历中逐个用instanceof分支处理 - 在框架回调或反射获取的对象上做类型适配,务必加判断,避免因数据来源不可控导致崩溃
- 工具方法中接收
Object参数并需按类型分支处理时,用instanceof比 try-catch 更高效、语义更清晰











