instanceof 是运行时窄化判断的临时手段,非加强类型安全的万能钥匙;它不改变多态行为,仅回答“引用是否指向某具体子类”,滥用会破坏开闭原则、削弱抽象设计、影响性能。
instanceof 在多态中不是用来“加强类型安全”的万能钥匙,而是运行时做**窄化判断**的临时手段——它本身不改变多态行为,只帮你回答“这个引用实际指向的是不是某个具体子类?”
instanceof 替代多态设计常见错误是写一堆 if (obj instanceof Dog) { ((Dog)obj).bark(); } 来分发逻辑。这直接破坏了开闭原则:每新增一个子类,就要改这段判断逻辑。
animal.speak() 自动调用对应子类实现,无需知道具体类型instanceof 出现的位置越靠前(比如在业务主流程里),说明抽象设计越薄弱instanceof 的合法使用场景它真正该出现的地方,是那些**绕不开具体类型信息**的边界操作

log.info("Received: {}", obj.getClass().getSimpleName())
Dog 而非 Animal
传统写法冗余且易出错:
if (obj instanceof Dog) {
Dog dog = (Dog) obj;
dog.bark();
}
Java 14 起支持模式匹配,一次完成判断 + 强制转换:
if (obj instanceof Dog dog) {
dog.bark(); // dog 已是有效局部变量
}
dog 作用域仅限于 if 块内,避免误用dog 非 null,不用再额外判空instanceof 与 null 比较(null instanceof Dog 恒为 false)父类和接口混用时,instanceof 判断结果可能反直觉:
new ArrayList() instanceof List → true(接口实现)new ArrayList() instanceof Serializable → true(间接实现)new ArrayList() instanceof RandomAccess → true(直接实现)new LinkedList() instanceof RandomAccess → false
instanceof 不影响方法分派——仍走虚方法表查找真正难处理的是类型擦除后的泛型:无论 List 还是 List,运行时都是 List,instanceof 无法区分。