泛型的边界

 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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值