泛型数组引发ClassCastException:Object无法转换为String类求解
问题原因分析
你遇到的ClassCastException本质是Java泛型的类型擦除机制导致的:
- 编译时泛型参数
T会被擦除为Object,所以(T[]) new Object[3]实际上是把一个Object[]强转成了编译期的T[]; - 但运行时这个数组的实际类型还是
Object[],当你尝试把它当作String[]使用(比如赋值给String[]变量、传递给需要String[]的方法)时,JVM会做类型检查,发现实际类型不匹配,就抛出「Class Object cannot be cast to String class」异常。
你的main方法里直接给数组元素赋值的操作本身不会抛异常,但如果后续有将t.data转为String[]的操作,就会触发这个错误。
正确的泛型使用方式
方案一:用集合代替数组(推荐)
Java的集合框架对泛型支持更完善,完全可以避免数组的泛型问题:
import java.util.ArrayList; import java.util.List; public class Test2<T> { private List<T> data = new ArrayList<>(3); public static void main(String[] args) { Test2<String> t = new Test2<>(); t.data.add("Amar"); t.data.add("Buddi"); t.data.add("puppy"); // 可以安全地转为String数组(如果需要) String[] strArr = t.data.toArray(new String[0]); } }
方案二:通过Class对象创建真正的泛型数组
如果必须使用数组,需要借助java.lang.reflect.Array类,通过传入Class<T>对象来创建实际类型为T[]的数组:
import java.lang.reflect.Array; public class Test2<T> { private T[] data; @SuppressWarnings("unchecked") public Test2(Class<T> clazz) { // 创建指定类型、长度为3的数组 data = (T[]) Array.newInstance(clazz, 3); } public static void main(String[] args) { Test2<String> t = new Test2<>(String.class); t.data[0] = "Amar"; t.data[1] = "Buddi"; t.data[2] = "puppy"; // 现在可以安全地将data赋值给String[]变量 String[] strArr = t.data; } }
内容的提问来源于stack exchange,提问作者Amar
相关产品推荐
相关产品推荐

