java泛型的边界:在运行时,泛型被擦除,类型为原始类型。
1.
中类型的丢失
import java.util.ArrayList;
public class TypeTest {
public static void main(String[] args) {
//泛型中的类型String,Integer在
Class
c1 = new ArrayList
().getClass();
Class
c2 = new ArrayList
().getClass(); System.out.println(c1 == c2); //true } }
//output true
2. 复杂点的例子:应用泛型后仍需使用强制类型转换
import java.lang.reflect.Array;
import java.util.Arrays;
@SuppressWarnings("hiding")
public class ArrayMaker
{
private Class
kind; public ArrayMaker(Class
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
StrsMaker = new ArrayMaker
(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]