Tiger学习 之 类型转换<generic>

了解一个概念 擦除(erasure)
泛型基本上完全在编译器中实现,由编译器执行的时候类型检查和类型推断,保证类型安全,然后生成普通的非泛型的字节码(然后在生成字节码之前将其清除,使其跟不用泛型的写法生成的字节代码基本一样)。这种实现技术 -- 擦除(erasure)

泛型的转换是基于对象本身的基础类型的,而不是基于泛型的参数化,所以
[quote]
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);

List<Integer> list2 = list1;
[/quote]

是基于list1 转换的,不是基于Interger转换,这样写OK!但如果这样写
[quote]
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);

List<Number> list2 = list1;
[/quote]
呵呵,很明显,编译器提示错误,但是如果这样

[quote]
List<Integer> list1 = new ArrayList<Integer>();
List list2 = list1;
list2.add("Hello");
[color=red]Integer i = list1.get(0);
//编译器不会提示错误,在运行时会抛出 Exception in thread "main" java.lang.ClassCastException: java.lang.String 异常![/color]
[/quote]

[color=blue]所以泛型的类型转换需要注意[/color]

通配符 --- "?" 为了配合可以接受类型的参数化..

为什么这段代码这样写
[quote]

List<Integer> list1 = new ArrayList<Integer>();
setList(list1);

public static void setList(List<?> list) {

}
[/quote]
"?"可以用Object代替吗?NO!前面说过,类型转换是有问题的...

but,经过通配符的对象之后,只能是只读的了,拒绝List<?>的add,set等操作.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值