- 对整个数组强制转型的例子(错误方法);
package test;
public class GenericParadigm<T> {
private T[] array;
public GenericParadigm(int sz) {
array = (T[]) new Object[sz];
}
public void put(int index, T item) {
array[index] = item;
}
public T get(int index) {
return array[index]; }
public T[] rep() {
return array; } //应该在运行时出口做文章
public static void main (String[] args){
GenericParadigm gai = new GenericParadigm(10);
// Integer[] ia = gai.rep(); //ClassCastException
Object[] oa = gai.rep(); //只能返回对象数组类型为Object[]
}
}
实际的运行时对象数组是Object[],而实际的运行时数组对象可能是T类型。
因此,应该在运行时,数组对象的出口做转型输出,入口方法在编译期已实现类型安全,所以出口方法可以放心强制类型转换,保证成功.
public class GenericArray2 {
private Object[] array; //维护Object[]类型数组
public GenericArray2(int sz) {
array = new Object[sz];
}
public void put(int index, T item) {
array[index] = item;
}
public T get(int index) {
return (T)array[index]; }//数组对象出口强转
public T[] rep() {
return (T[])array; } //运行时无论怎样都是Object[]类型
public static void main (String[] args){
GenericArray gai = new GenericArray(10);
// Integer[] ia = gai.rep(); //依旧ClassCastException
Object[] oa = gai.rep(); //只能返回对象数组类型为Object[]
gai.put(0,11);
System.out.println(gai.get(0)); // 11 ,出口成功转型
}
}
- 通过反射在运行时构出实际类型为type[]的对象数组,避免了类型擦除,从而转换成功,无
ClassCastException
.
public class GenericArrayWithTypeToken {
private T[] array;
public GenericArrayWithTypeToken(Class type, int sz) {
array = (T[]) Array.newInstance(type, sz);//通过反射在运行时构出实际类型为type[]的对象数组,避免了类型擦除,从而转换成功,无ClassCastException
}
public void put(int index, T item){
array[index] = item;
}
public T get(int index) {
return array[index]; }
public T[] rep() {
return array; } //能成功返回了~
public static void main(String[] args) {
GenericArrayWithTypeToken gawtt = new GenericArrayWithTypeToken<>(Integer.class, 10);
Integer[] ia = gawtt.rep(); //能成功返回了!
}
}
模板
public class ArrayQueue<T> {
private int front=0;//头部指针,空
private int rear=0;//尾部指针,有值
private int maxSize=10;//容量,默认给10
private T[] array;//数组,存储内容
public ArrayQueue(Class<T> clazz,int maxSize) {
this.maxSize = maxSize;
array = (T[]) Array.newInstance(clazz, maxSize);
}
}
结论
不能(直接)创建泛型数组
泛型数组实际的运行时对象数组只能是原始类型( T[]为Object[],Pair[]为Pair[] ),而实际的运行时数组对象可能是T类型( 虽然运行时会擦除成原始类型 )