我有以下代码:
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构造函数以初始化选项卡?
答案 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]