Java泛型,将T[]强制转换为原始类型

Java泛型,将T[]强制转换为原始类型,java,Java,我有一个容器类,看起来像这样。(我正在删除所有逻辑方法以减少混乱) 公共抽象类容器{ 受保护的T[]阵列; 公共集装箱(整箱容量){ 数组=(T[])新对象[容量]; } 公共T[]数组(){ 返回数组; } } 使用此类,如下所示: public final class ItemContainer extends Container<Item> { public ItemContainer(int capacity) { super(capacity);

我有一个容器类,看起来像这样。(我正在删除所有逻辑方法以减少混乱)

公共抽象类容器{
受保护的T[]阵列;
公共集装箱(整箱容量){
数组=(T[])新对象[容量];
}
公共T[]数组(){
返回数组;
}
}
使用此类,如下所示:

public final class ItemContainer extends Container<Item> {

    public ItemContainer(int capacity) {
        super(capacity);
    }

}
公共最终类ItemContainer扩展了容器{
公共项目容器(整数容量){
超级(容量);
}
}
这个容器现在应该包含一个项目数组。但是,当尝试将其传递给要使用的
项[]
时,会出现以下错误:

线程“ForkJoinPool-2-worker-1”中出现异常 java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为 [Lcom.oblivion.entity.item.item


我该如何解决这个问题呢?

当你创建一个对象数组(或者实际上是任何其他对象)时,它在你转换时不会改变类型,事实上转换为通用的t[]因此,
array
方法返回一个对象数组,调用者试图隐式地将该数组转换为一个Item数组,当然失败了

如果要创建参数化类型的数组,应该有一个接受
的方法。然后可以使用该方法创建数组


或者,您可以使用ArrayList使用的方法:在内部使用对象数组,如果调用者需要数据快照,则要求调用者传入适当类型的数组。

是否有理由使用数组而不是某些集合(集合、列表等)?这些都是你想要的cleaner@LionC-此项目的挑战是不使用集合库。我可以使用
列表轻松完成此功能。注意:不是学校项目,只是个人项目。“挑战”从某种意义上说,您不能出于技术原因使用它,或者从某种意义上说,您想尝试在没有集合的情况下使用Java?产生异常的代码行是什么?您应该看看ArrayList是如何实现的-它正是这样做的。
public Container(Class<T> clazz, int capacity) {
    array = (T[]) Array.newInstance(clazz, capacity);
}
public Container(Class<T> clazz, int capacity) {
    array = (T[]) Array.newInstance(clazz, capacity);
}
T t = clazz.cast(object);
T t = clazz.newInstance();