转:http://blog.sina.com.cn/s/blog_69a4df530100p8w1.html
经过将近两个小时的学习与思考,对java泛型有了新认识,之前一直都是随便用用,而没有深入学习、思考,趁着现在有空闲时间,重新再学一下泛型,才明白其较深层的意思。
学习泛型时,最大困惑的就是里面的通配符使用。现在好好总结一翻:首先从网上的仁兄那,解析下,什么是泛型,为什么要使用泛型:
泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。
接下来,就是实践了,话不在多,直接看代码:
package com.gen.test;
class A<K, V> {
}
public class TestGen1 {
}
这里给我们的启动时,泛型有点像C++里的模块。
//demo two//
package com.gen.test;
class B<K extends String, V extends Integer> {
}
public class TestGen2 {
}
会发现,在类的声明处,用了一个叫extends的关键字,有必要说一下:
Extends: 上界用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。
Super: 下界用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。
下面,利用作图法,使我们能看得更清楚:
假如代码如下:<? Extends Date>,<? Super Date>
看了图之后,就不难理解了。
如果对此想深入研究的话,请参考下面的一位仁兄写的文章:
http://fyting.javaeye.com/blog/122732
最后我想说一下,“?”这个问题的用法:
先看代码:
class C<K ,V extends Number> {
class D<J extends C<String,? super Number>,K>{
}
C<String,? super Number>:?处,只能传入以Number为下限的东西,即Number的父类而class C<K ,Vextends Number>又限定了,只能传以Number为上限的东西,即Number的子类,最终限定了,我们只能传Number类
public class TestGen3 {
}
个人觉得,学习泛型是一个需要仔细思考的一个过程,有了这些基础之后,相信对看一些开源框架有帮助,毕竟写框架的作者都是些高手。
今天学习了java annotation与泛型,巩固一下自己的基础。