繁体   English   中英

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

[英]Java generics, Casting a T[] to original type

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

public abstract class Container<T> {

    protected T[] array;

    public Container(int capacity) {
        array = (T[]) new Object[capacity];
    }

    public T[] array() {
        return array;
    }
}

使用此类,如下所示:

public final class ItemContainer extends Container<Item> {

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

}

现在,此容器应容纳一个Items数组。 但是,当尝试将其传递给要使用的Item[] ,会出现以下错误:

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

我该如何解决?

创建对象(或实际上任何其他对象)的数组时,在转换时它不会更改类型,实际上,转换为通用T []完全没有效果。 因此, array方法返回一个Object数组,调用方尝试将其隐式转换为Item数组,而该方法当然会失败。

如果要创建参数类型的数组,则应该有一个接受Class<T> 然后,您可以使用Array.newInstance方法创建数组。

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

public Container(Class<T> clazz, int capacity) {
    array = (T[]) Array.newInstance(clazz, capacity);
}

在语言设计中,需要强制转换有点偶然。 存在一个具有多个维的重载newInstance ,因此,在T[]...[]的情况下,无法完成通用结果类型。

您可能要存储用于创建对象或强制转换的组件类:

T t = clazz.cast(object);
T t = clazz.newInstance();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM