java知识整理-(1)泛型generics

泛型(generics) :带参数化类型的类或接口,比如最熟悉的List<E>。读做list of E。
原始类型(raw type):泛型中不包括尖括号的部分,上面的例子中的List
 parameterized types :尖括号中的部分,例子中的E,可以是任何接口或者类。
从1.5开始支持的。为了可读性和类型安全。

但是个人感觉有时比较繁琐,特别是用不好的时候。
特别是java的泛型又让你感觉比较奇怪。。。。

最开始认识是从List<T>接口开始的。

后来自己也写过几个,特别是DAO。

通过学习,知道了类型擦除。但为什么要擦除呢?
自己推测了一下:
Java的一个非常好的特点就是向下兼容。
如果不类型擦除,Foo(List<Integer>)和Foo(List<String>)可以重载,那么List<Integer>.class和List<String>.class必定不同。
这样的话对jvm已有的类型系统是个很大的冲击。(个人认为这是最重要的原因)


知道了类型擦除,很多东西就想明白了,比如,Foo(List<Integer>)和Foo(List<String>)不可以重载,因为擦除后都变成了Foo(List)。

通过javap证实了这点,但--
在类头文件却发现了泛型的信息,记录了类成员的泛型实际类型。
查了资料,知道了可以通过反射取得使用处的实际类型。
如 private List<Integer> list ; // 通过反射可以获得Integer

更高一级的就是通配符“?”了;
之前知道List<? extends XXX> list;只能读,不能写,而不知道其原因。
看了effective java 2nd后,知道了PECS:producer-extends, consumer-super。
关于<? extends XXX>看list.addAll就全明白了。List<Object>可以addAll List<Integer>的集合。


前段时间看了论坛的帖子,学到了协变和逆变,结合PECS,对泛型的理解又加深了一些。

虽然现在感觉理解的很不错,但我知道,随着以后的使用、学习、思考,会发现现在知道的不过是一些皮毛。

记录于此,供以后回头看看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值