首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java学问整理-(1)泛型generics

2012-09-08 
java知识整理-(1)泛型generics泛型(generics) :带参数化类型的类或接口,比如最熟悉的ListE。读做list of

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,对泛型的理解又加深了一些。

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

记录于此,供以后回头看看。

热点排行