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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:13:11