java泛型的边界:在运行时,泛型被擦除,类型为原始类型。
1. <T>中类型的丢失
import java.util.ArrayList;
public class TypeTest {
public static void main(String[] args) {
//泛型中的类型String,Integer在
Class<?> c1 = new ArrayList<String>().getClass();
Class<?> c2 = new ArrayList<Integer>().getClass();
System.out.println(c1 == c2); //true
}
}
//output
true
2. 复杂点的例子:应用泛型后仍需使用强制类型转换
import java.lang.reflect.Array;
import java.util.Arrays;
@SuppressWarnings("hiding")
public class ArrayMaker<T> {
private Class<T> kind;
public ArrayMaker(Class<T> kind) {
this.kind = kind;
}
@SuppressWarnings("unchecked")
T[] create(int size) {
//此处Array.newInstance()方法返回的是Object,必须转型;说明期望的泛型没有起任何作用
return (T[]) Array.newInstance(kind, size);
}
@SuppressWarnings("unchecked")
T[] create(T t, int size) throws InstantiationException, IllegalAccessException {
//此处Array.newInstance()方法返回的是Object,必须转型;说明期望的泛型没有起任何作用
T[] ts = (T[]) Array.newInstance(kind, size);
//注意:此处仍能保证放入T[]的类型为T
for(int i=0; i<ts.length; i++) {
ts[i] = t;
// ts[i] = new Object(); //Type mismatch: cannot convert from Object to T
}
return ts;
}
public static void main(String[] args) throws Exception {
ArrayMaker<String> StrsMaker = new ArrayMaker<String>(String.class);
String[] strsArray = StrsMaker.create(10);
String[] strsArray2 = StrsMaker.create("AA", 10);
System.out.println(Arrays.toString(strsArray));
System.out.println(Arrays.toString(strsArray2));
}
}
//output
[null, null, null, null, null, null, null, null, null, null]
[AA, AA, AA, AA, AA, AA, AA, AA, AA, AA]