在某个类或者方法上声明了泛型T,如何才能创建T数组并有正确的长度了?
public class Sequence <T> {
private int size;
private T[] items;
//...
{
}
}
由于泛型是只在编译时期检查的,在经过编译器输出之后任何泛型都会转换为Object类型,我觉得这就是泛型为什么可以表示为任意类型的原因了
但是由于java不支持直接通过 new T[size] or new T[]{o1, o2, o3,}的方式来创建泛型数组所以,要实现泛型数组可以通过:
方法1:
items = (T[])new Object[size];
这是为什么呢?因为泛型T会在编译时原语句会 转换为
private Object[] items;
items = (Object[])new Object[size]; 所以是可以行的
所以不能这样认为 Object可以转为任意类型:
String[] strs = (String[])new Object[size];
这样是错误的。导致编译器认为数组里面的元素都是String类型的,但是由于在运行时实际上最初是一个Object数组类型的 Object[] > String[] 类型, 运行时将会发生ClassCastException 异常。所以不能将最初是一个Object[]转为String[]。
假如有一个get方法:
T getT(){
return items[0];
}
那么经过编译器输出同样是
Object getT(){
return items[0];
}
而在使用的时候,编译器同样会在使用的地方:真类型 = getT();编译器输出:真类型 = (真类型)getT(); 会自动地加上相应的类型。
方法2:
可以通过传递给定class参数,也可以在有实例化一个泛型类型时,通过getClass()来得到当前泛型类!
(T[])Array.newInstance(t.getClass(), length);