You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段Java泛型数组代码会抛出ClassCastException异常?

泛型数组强转导致ClassCastException的原因分析

异常产生时机

运行时执行object.field[0] = "Test";这行代码时,直接抛出ClassCastException。

核心原因

  1. Java泛型的擦除机制:Java泛型是编译期特性,运行时泛型类型会被擦除。你的A<AnyType>类中,AnyType没有指定上限,编译后会被擦除为Object。所以构造器里的(AnyType[]) new Object[5],编译后实际是(Object[]) new Object[5]——这是合法的转换,不会报错,但本质上field的实际类型还是Object[]。

  2. 数组的运行时类型检查:数组是保留运行时类型信息的容器。当你实例化A<String>后,编译器在编译期会帮你做类型校验,允许你给field[0]赋值String,但编译后的字节码中,这行代码会被插入一个隐式的类型转换:把object.field强制转换为String[],再执行赋值操作。

而运行时JVM发现object.field的实际类型是Object[],并不是String[],所以这个隐式强转直接触发ClassCastException。

为什么指定String类型仍无法赋值?

因为泛型擦除后,运行时JVM不知道你实例化的是A<String>,field的实际类型始终是Object[]。编译器的类型校验只是编译期的“语法糖”,运行时数组的真实类型不会因为泛型参数而改变。你试图把Object[]当成String[]来操作,本质上是跨类型的非法强转,必然触发异常。


内容的提问来源于stack exchange,提问作者K6J4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:11:15