为何这段Java泛型数组代码会抛出ClassCastException异常?
泛型数组强转导致ClassCastException的原因分析
异常产生时机
运行时执行object.field[0] = "Test";这行代码时,直接抛出ClassCastException。
核心原因
Java泛型的擦除机制:Java泛型是编译期特性,运行时泛型类型会被擦除。你的
A<AnyType>类中,AnyType没有指定上限,编译后会被擦除为Object。所以构造器里的(AnyType[]) new Object[5],编译后实际是(Object[]) new Object[5]——这是合法的转换,不会报错,但本质上field的实际类型还是Object[]。数组的运行时类型检查:数组是保留运行时类型信息的容器。当你实例化
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
相关产品推荐
相关产品推荐

