LibGDX Array内部数组非类型安全:继承后直接访问items报错问题
问题原因分析
这个问题其实和Java泛型的类型擦除以及LibGDX Array的底层实现直接相关:
LibGDX的Array类为了追求性能,并没有使用泛型数组(Java本身不允许直接创建T[]这种泛型数组实例),而是用Object[] items来存储所有元素。虽然你声明了extends Array<MyClass>,但在运行时泛型类型信息会被擦除,items本质还是Object[]。
当你直接遍历items或者访问items[index]时,编译器无法自动将Object转换为MyClass(它没法确定数组里的元素真的都是MyClass类型),所以会抛出类型转换错误。而get(int index)方法内部已经帮你做了强制类型转换,所以调用它不会有问题——你可以去看LibGDX Array的源码,get方法大概是这样的:
public T get (int index) { return (T)items[index]; }
解决方案
这里有几种可行的解决办法:
1. 用get()方法遍历(最安全推荐)
既然get()已经处理了类型转换,直接用它遍历就好:
public class MyArray extends Array<MyClass> { public void method() { for (int i = 0; i < size; i++) { MyClass myItem = get(i); System.out.println(myItem); } } }
2. 手动强制转换items元素
如果一定要直接操作items数组,需要手动做类型转换,但要注意确保数组里的元素确实都是MyClass(避免ClassCastException):
public class MyArray extends Array<MyClass> { public void method() { for (Object obj : items) { if (obj == null) continue; // 处理空元素 MyClass myItem = (MyClass)obj; System.out.println(myItem); } } }
3. 直接遍历MyArray本身
因为LibGDX的Array实现了Iterable<T>接口,你可以直接遍历当前对象,内部会用正确的迭代器处理类型转换:
public class MyArray extends Array<MyClass> { public void method() { for (MyClass myItem : this) { System.out.println(myItem); } } }
内容的提问来源于stack exchange,提问作者Hasen
相关产品推荐
相关产品推荐

