如何初始化包含泛型的泛型数组?

时间:2016-05-13 06:52:49

标签: java arrays generics initialization

我有以下代码:

public class I<T> {
    private T t;
    public I(T t) {
        this.t=t;
    }
}

public class G<T> {
    private I<T> tab[];
    public G() {
        tab=(I<T>[]) new Object[10];
    }
}

调用G()会抛出ClassCastException。

如何编写G构造函数以初始化选项卡?

3 个答案:

答案 0 :(得分:1)

tab=(I<T>[]) new I<?>[10];

是答案,但对我来说仍然是神秘的!

答案 1 :(得分:0)

希望能够揭开你自己的答案:请注意,java通过擦除来实现泛型,即编译器基本上进行一些编译时间检查,然后丢弃泛型。

因此,从运行时的角度来看,您的第一种方法归结为:

I[] tab = (I[]) new Object[10];

由于数组类型是真正的尊重类,因此在这里得到一个类转换异常,因为I [] .class与Object []。class不同。

你的第二种方法是(遗弃了泛型):

I[] tab = (I[]) new I[10];

......这里没问题。

答案 2 :(得分:0)

Tab是I的数组。我是一个对象,但由new Object()创建的简单对象 a I.这解释了为什么第一种方法产生了错误。您必须创建一个I数组来初始化tab

但并非全部:java泛型使用类型擦除。这意味着在运行时编译器不知道T是什么。当T没有任何意义时,tab = new I<T>[10];在运行时执行,因此出错。

解决方案是创建 I of any new I<?>)或I<Object>数组的数组,或者甚至使用旧的(pre-generic)语法{{ 1}}。

这里没有问过,但是当你真的需要知道泛型中参数的类型时,常见的习惯是在构造函数中或者使用setter明确地传递类,以便泛型对象可以使用它。代码可以是:

new I[10]