java泛型攻略
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在已发布的Java1.4中在核心代码库中增加了许多新的API(如Loging,正则表达式,NIO)等,在最新发布的JDK1.5和即将发布的JDK1.6中也新增了许多API,其中比较有重大意义的就是Generics(范型)。
一.什么是Generics?
Generics可以称之为参数类型(parameterized types),由编译器来验证从客户端将一种类型传送给某一对象的机制。如Java.util.ArrayList,
编译器可以用Generics来保证类型安全。
在我们深入了解Generics之前,我们先来看一看当前的java 集合框架(Collection)。在j2SE1.4中所有集合的Root Interface是Collection
Collections example without genericity: Example 1
1 protected void collectionsExample() {2 ArrayList list = new ArrayList();3 list.add(new String("test string"));4 list.add(new Integer(9)); // purposely placed here to create a runtime ClassCastException5 inspectCollection(list);6 }789 protected void inspectCollection(Collection aCollection) {10 Iterator i = aCollection.iterator();11 while (i.hasNext()) {12 String element = (String) i.next();13 }14 }
以上的样例程序包含的两个方法,collectionExample方法建立了一个简单的集合类型ArrayList,并在ArrayList中增加了一个String和一个Integer对象.而在inspecCollection方法中,我们迭代这个ArrayList用String进行Cast。我们看第二个方法,就出现了一个问题,Collection在内部用的是Object,而我们要取出Collection中的对象时,需要进行Cast,那么开发者必需用实际的类型进行Cast,像这种向下造型,编译器无
法进行检查,如此一来我们就要冒在代码在运行抛出ClassCastException的危险。我们看inspecCollection方法,编译时没有问题,但在运行时就会抛出ClassCastException异常。所以我们一定要远离这个重大的运行时错误
二.使用Generics
从上一章节中的CassCastException这种异常,我们期望在代码编译时就能够捕捉到,下面我们使用范型修改上一章的样例程序。
//Example 2
1 protected void collectionsExample() {2 ArrayList
从上面第2行我们在创建ArrayList时使用了新语法,在JDK1.5中所有的Collection都加入了Generics的声明。例:
//Example 3
1 public class ArrayList
这个E是一个类型变量,并没有对它进行具体类型的定义,它只是在定义ArrayList时的类型占位符,在Ex
ample 2中的我们在定义ArrayList的实
例时用String绑定在E上,当我们用add(E element)方法向ArrayList中增加对象时, 那么就像下面的写法一样: public void add(String element);因为在ArrayList所有方法都会用String来替代E,无论是方法的参数还是返回值。这时我们在看Example 2中的第四行,编译就会反映出编译错误。
所以在java中增加Generics主要的目的是为了增加类型安全。
通过上面的简单的例子我们看到使用Generics的好处有:
1.在类型没有变化时,Collection是类型安全的。
2.内在的类型转换优于在外部的人工造型。
3.使Java 接口更加强壮,因为它增加了类型。
4.类型的匹配错误在编译阶段就可以捕捉到,而不是在代码运行时。
受约束类型变量
虽然许多Class被设计成Generics,但类型变量可以是受限的
public class C1
public class C2
第一个T变量必须继承Number,第二个T必须继承Person和实现Comparable
三.Generics 方法
像Generics类一样,方法和构造函数也可以有类型参数。方法的参数的返回值都可以有类型参数,进行Generics。
//Example 4
1 public
这里,max方法的参数类型为单一的T类型,而T类型继承了Comparable,max的参数和返回值都有相同的超类。下面的Example 5显示了max方法的几个约束。
//Example 5
1 Integer iresult = max(new Integer(100), new Integer(200));2 String sresult = max("AA", "BB");3 Number nresult = max(new Integer(100), "AAA"); // does not compile
在Example 5第1行参数都为Integer,所以返回值也是Integer,注意返回值没有进行造型。
在Example 5第2行参数都为String,所以返回值也是String,注意返回值没有进行造型。以上都调用了同一个方法。
在Example 5第3行产生以下编译错误:
Example.java:10: incompatible types
found : ng.Object&java.io.Serializable¶ble>
required: ng.Number
Number nresult = max(new Integer(100), "AAA");
这个错误发生是因为编译器无法确定返回值类型,因为String和Integer都有相同的超类Object,注意就算我们修正了第三行,这行代码在运行仍然会报错,因为比较了不同的对象。
四.向下兼容
任何一个新的特色在新的JDK版本中出来后,我们首先关心的是如何于以前编写的代码兼容。也就是说我们编写的Example 1程序不需要任何的改变就可以运行,但是编译器会给出一个"ROW TYPE"的警告。在JDK1.4中编写的代码如何在JVM1.5中完全兼容运行,我们要人工进行一个:Type erasure处理过程
五.通配符
//Example 6
List
ist = stringList ;//2objectList .add(new Object()); // 3String s = stringList .get(0);//4
乍一看,Example
6是正确的。但stringList本意是存放String类型的ArrayList,而objectList中可以存入任何对象,当在第3行进行处理时,stringList也就无法保证是String类型的ArrayList,此时编译器不允许这样的事出现,所以第3行将无法编译。
//Example 7
void printCollection(Collection
ShowObject(); System.out.println("对象是:"+examples.getOb()); }}
我们来看Example 9没有使用范型,所以我们需要进行造型,而Example 10我们不需要任何的造型
2.二个参数的Generics
//Example 11
class TwoGen
3.Generics的Hierarchy
//Example 12
class Stats
4.使用通配符
//Example 14
class StatsWildCard
sameAvg(StatsWildCard> ob) { if (average() == ob.average()) return true; return false; }}public class GenericsExampleByWildcard { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Integer inums[] = { 1, 2, 3, 4, 5 }; StatsWildCard
5.使用边界通配符
//Example 15
class TwoD { int x, y; TwoD(int a, int b) { x = a; y = b; } } // Three-dimensional coordinates. class ThreeD extends TwoD { int z; ThreeD(int a, int b, int c) { super(a, b); z = c; } } // Four-dimensional coordinates. class FourD extends ThreeD { int t; FourD(int a, int b, int c, int d) { super(a, b, c); t = d; } } // This class holds an array of coordinate objects. class Coords
wXYZ(tdlocs); // Error, not a ThreeD // showAll(tdlocs); // Erorr, not a FourD // Now, create some FourD objects. FourD fd[] = { new FourD(1, 2, 3, 4), new FourD(6, 8, 14, 8), new FourD(22, 9, 4, 9), new FourD(3, -2, -23, 17) }; Coords
6.ArrayList的Generics
//Example 16
public class ArrayListGenericDemo { public static void main(String[] args) { ArrayList
7.HashMap的Generics
//Example 17
public class HashDemoGeneric { public static void main(String[] args) { HashMap
8.接口的Generics
//Example 18
interface MinMax
9.Exception的Generics
//Example 20
interface Executor
"IOException: " + ioe); ioe.printStackTrace(); } }}
武大四大名嘴之一:陆保生的经典语录。比易中天还搞笑,据说在武大和易中天是同学。
阅读原文 - 发给好友 - 收藏取消 - 加标签 | 更多
军事理论课的语录 1、 你们知道朝鲜战争是谁发动的吗?2000年前的书都是假的。不是美国,也不是韩国,而是金日成。你们知道金日成谁吗?他是金正日的老爸。那你们又知道金正日是谁吗?不错,他就是金日成的儿子。2、 越南战争是我们最痛心的战争,大家知道我们给他们的援助最多,但这个民族背叛了我们。他们有句口号,打到云南吃早饭,打到广西过春节。我认为:说这句话是越南人民的悲剧。当时我是非常非常气愤的... 全文↓
作者:唐月 | 来自:唐月军事理论课的语录
1、 你们知道朝鲜战争是谁发动的吗?2000年前的书都是假的。不是美国,也不是韩国,而是金日成。你们知道金日成谁吗?他是金正日的老爸。那你们又知道金正日是谁吗?不错,他就是金日成的儿子。
2、 越南战争是我们最痛心的战争,大家知道我们给他们的援助最多,但这个民族背叛了我们。他们有句口号,打到云南吃早饭,打到广西过春节。我认为:说这句话是越南人民的悲剧。当时我是非常非常气愤的,要不是年龄小我就去战场了,记得那年我刚满十岁。
3、 在三年自然灾害刚过,中国最困难的时候,印度就侵犯中国边界,这场战争持续了三十三天。刚开始我们是抱着打攻坚战的决心去的,哪知道印度军不堪一击、强壮的士兵逃走了,年纪大的将军跑不动就躲在山洞里。我们大部队开过去了,炊事班留下做饭,印度将军饿了,就举着双手出来找吃的。所以印度的将军是我们的炊事员抓住的的。
4、 印度的孟买日报发表了一篇文章,他们说:“如果印度再不努力,在过十年,中国的上海就超过我们了。”可见那次战争在印度人心灵上是留下了伤痕的。
5、 我们这辈人对日本是不信任的,我也把这种思想传输给下一代。我女儿在四岁的时候看日本动画片,我不喜欢,就给他讲中日关系,结果她不看了。可是有一天,我突然回家发现她又看日本动画片,她以为我要批评她,说:“爸爸,我可以问两个问题吗?”我答应了。她第一个问题问:“爸爸,别的小朋友都看,我为什么不能看?”我说这个问题很尖锐。她又问:“你认为中国的的动画片好看吗?”我无语了。就陪她看了一集日本动画片《樱桃小丸子》。
6、 我们中国一向重陆轻海,何以见得,因为我们说寸土必争,又说苦海无边,回头是岸。
7、 当大家国庆
阅兵看到中国预警机飞过是何等自豪,但你们知道技术是哪来的吗?记得那年美国预警机在侵犯南海领空,结果被逼停迫降,但我们的王伟牺牲了。大家就问为什么不打下来啊?当然打下来用一句话说就是怎一个爽字了得,可不打总是有原因的。以前我们的预警机技术不成熟,但当我们的专家登上美国的飞机时,顿时泪流满面,他说以前不明白的全懂了。美国当时就说,这飞机就是美国领土,不知道是美国人傻,还是他们认为中国比他们更傻?在中国的土地上,我们当然是该看的看了,不该看的也看了。所以我们预警机还要感谢美国人民。
8、 大家知道美国卫星的偷窥欲已经达到0.1到0.5米,每天都在天上偷窥我们。当然我们也在天幕上偷窥他们,就是质量差了点,但够了。我们和美国就是这样偷窥来,偷窥去。
9、 在抢南海的岛屿时,我们什么也没抢到,就立了一块牌子。可牌子是不作数的,不然的话我们去太平洋每个小岛立块牌子,就说太平洋是我们的。
10、 我在武汉大学念书,当时还有两个竞争者,有个是北大的,还有个也是武大的和我竞争留校的岗位,结果我被留校了。后来我问我们部长为什么留我,他说:“你看起来比较老实。”我说:“部长,你错了,我比看起来老实多了。”
11、 我们部长以前是珍宝岛战役的侦察排长,受了很多伤,至今身上有几十块弹片没取出。但他很会受伤,关键部位一片弹片都没有,全打在大腿和臀部。
12、 我们部长在珍宝岛战役立了二等功,留在部队升的很快,马上就会是团长,师长,军长。但他选择了来我们美丽的珞珈山武汉大学,你们知道为什么吗?因为他找了一个武汉大学学生物系的女朋友。
13、 我的部长留在部队为什么会升的快呢?因为他立过功,长得帅,还有学历高。他的学历是什么呢?就是··········高中文凭。你们不要笑,那时的高中比现在的博士生值钱,你们在武汉大学的任何一个厕所都会碰到好几个博士,但在那时走遍一条街也许碰不到高中生。
14、 朝鲜又发导弹了,朝着日本。当然他们每次都朝着日本。日本提出严厉抗议,说领空被侵犯,朝鲜说我们发的不是导弹,是人造卫星。导弹是在空中飞的,我们是在天上飞的,空中和天上是不一样的。
15、 朝鲜战争爆发,当时毛主席在床上看书,有人他在做别的事,但我调查研究觉得还是看书可能性比较大。
16、 看看中国旁边都是些什么国家啊,哪一个不是如狼似虎。
17、 在朝鲜美国人抓了志愿军两万人,我们抓了联合军八万
人(包括美军和韩军)。我们把俘虏交给朝鲜方面看管,结果被杀了。在谈判时,美军抓了两万多,交出两万多。我们抓了八万多,交出一万多。美国人就质问我们,我们只好回答:“一部分活了下来,还有的水土不服,饿死了。”
18、 你们知道世界国防日是哪天吗?你们不知道不是你们的错,是“他们”的错。我每天看CCTV,有很多日,什么世界爱鸟日,糖尿病日,卫生日,就没有国防日。
19、 当我考上武汉大学那年,阿姆斯特朗也登上了月球。我跟我妈妈讲,她不相信,我说他们在上面见到了嫦娥,她说这才差不多。我们不要随便打破他们的信仰。
20、 日本不是没有军队的国家,而是没有国家的军队。
21、 进口的手机都可能被监听。但我不怕,我相信美国人听不懂中国话,就算听得懂中国话,也听不懂我的普通话。
22、 我的一个同学是中国最顶尖的导弹专家,我一次跟他说:“把你们的资料拷给我吧。”他说:“这种事情不要再电话里说。”可见美国人在监听我们。
23、 如果美国人监听我的电话,他们一定觉得我的话比中国相声好听,因为我跟朋友什么都讲。
24、 我曾经想,在美国鬼子侵略我们时,我在地上挖个洞,插一根牙签,但现在知道那是行不通的。
25、 我们的年青人比美军勇敢,他们伊拉克战争时在沙漠中飙车,我们的小伙子敢在杭州市中心飙车。
26、 美国打伊拉克时势如破竹,在路上驰骋,突然前面的车停下来了,士兵说有地雷,过去一看果然路面上躺着地雷。士兵就纳闷说:“地雷为什么不埋起来呢?盖点黄沙也是好的。”军官就骂他:“笨蛋,那是不埋的地雷!”原来不埋得地雷也叫地雷。(因为伊拉克的士兵畏战,没把地雷埋下就逃了)
27、 听说伊拉克要打巷战了,我在电视机前一等就是好几天,来广告也看了。里面有个广告说今年20,明年18.我觉得那有什么好,今年39,明年29那才好。因为我那年39岁。最后巷战没打,我被骗了。
28、 美国队伊拉克将军说:“给你们三十万美元,别打了。”伊拉克将军说:“我们是那样的人吗?”美国人说:“那就一百万。”伊拉克将军说:“那怎么好意思!”所以伊拉克没有抵抗。
29、 英国人说美国大兵都像他们的总统布什那样“先打枪,后动脑。”德国人说:“美国人真坏!”
30、 美国人在伊拉克的战争现在还没结束,正如《大话西游》里紫霞仙子所说的“我猜到了开始,却没猜到结局。”
31、 信息化战争就是指哪打哪,就像李寻欢的小李飞刀一样,在大脑指挥系统和器官之间
形成默契。剑就是我,我就是剑(贱)!
32、 美国F16后面跟了一大堆“机”,就像现在明星后面跟了一大堆保镖,布什明星也成明星,布什大腕也成大腕。就像那个于丹,到一个城市骇然警察开道。其实她讲的怎么样,大家都知道。(轻蔑的口气)
33、 比如你去打泰森,我帮你当拉拉队,或者偶尔捡块小石子仍他,这就是联合作战。
34、 离开网络,战争就不能打。就像现在的孩子没网络就不能活,他们在网上聊天,在网上种菜,还在网上偷菜,那是QQ农场。
35、 石墨炸弹是由化学处理过的,非常难处理。就像我们心里的忧愁。剪不断,理还乱,才下眉头,又上心头。
36、 武大也有防空洞,里面都是香蕉和苹果。你们躲进去可以吃香蕉,我不喜欢香蕉,苹果还可以。
37、 美国进三角洲部队的考题:“你女朋友被歹徒凌辱,你是报警还是私人解决?”你们怎么回答?·······如果是我,我拒绝回答这类愚蠢的问题。
38、 美国的次声波武器很厉害,杀人于无形。但我们有些歌星比他们更厉害,吓死我了!
39、 炸了城市也有好处,很多人又隐居山林的想法,我也早就有了,但前提是中了500万。
40、 我的计算机和我的普通话一样令我忧伤。
41、 美国说我们的无人机是他们的山寨版,我想说是山寨版那又怎么样?事实上我们的无人机还不错。
42、 那天马哈苏德在天台做足疗,美国的侦察机就来了。本来我以为只有中国有钱而无聊的人才洗脚,原来外国人也洗脚,寻找那种足疗快感。
43、 我告诉大家,我很会开锁,第一次把钥匙忘家里,我找一个开锁的,他几秒钟就搞定了,他要了我37,但我知道只要往里面塞塑料袋,再用螺丝刀拧就行。第二次又忘家里,我找了另外一家,他居然要50。我说你快塞塑料袋,你不塞我塞了。他知道我是高手,就收了37。
44、 特种部队不仅要敢做坏事,还要敢做一切坏事。这个我们不符合,因为我们是好人。
45、 美国的无人侦察机最小只有苍蝇那样,所以我每次上课都看看有没有苍蝇,如果有,它就是美国派来偷窥我上课。
46.我曾一个人上街游行....
不想回首时一片灰色,我用欢笑涂抹我的世界和周遭界野,刷上一层灿烂的亮色——呵,这世界我来过,我爱死了这阳光!!!
我的目光清淡如水
连风 也不知
我在望你
单调的按键音儿是我这夜的独奏,我有点爱上这种清冷 空冥的感觉了.
柏拉图名言:
在短暂的生命里寻找永恒。 爱是美好带来的欢欣,智慧创造的奇观,神仙赋予的惊奇。缺乏爱的人渴望得到它,拥有爱的人万般珍惜它。 爱情,只有
情,可以使人敢于为所爱的人献出生命;这一点,不但男人能做到,而且女人也能做到。 尊重人不应该胜过尊重真理。 时间带走一切,长年累月会把你的名字、外貌、性格、命运都改变。 拖延时间是压制恼怒的最好方式。 初期教育应是一种娱乐,这样才更容易发现一个人天生的爱好。 人心可分为二,一部较善,一部较恶。善多而能制止恶,斯即足以云自主,而为所誉美;设受不良之教育,或经恶人之熏染,致恶这一部较大,而善这一部日益侵削,斯为己之奴隶,而众皆唾弃其人矣。 良好的开端,等于成功的一半。 最有美德的人,是那些有美德而不从外表表现出来,仍然感到满足的人。 好人之所以好是因为他是有智慧的,坏人之所以坏是因为人是愚蠢的。 一切背离了公正的知识都应叫做狡诈,而不应称为智慧。 不知道自己的无知,乃是双倍的无知。 没有什么比健康更快乐的了,虽然他们在生病之前并不曾觉得那是最大的快乐。 我们应该尽量使孩子们开始听到的一些故事必定是有道德影响的最好的一课。 法律是一切人类智慧聪明的结晶,包括一切社会思想和道德。 只有死者能看到战争的结束。 每天告诉自己一次:“我真的很不错”。 生气是拿别人做的错事来惩罚自己。 每个在恋爱中的人都是诗人。 无论你从什么时候开始,重要的是开始后就不要停止;无论你从什么时候结束,重要的是结束后就不要悔恨。 只要有信心,人永远不会挫败。
我总是不敢去追求我想要的幸福,因为那些我都不曾拥有,也根本无法拥有!放手吧,放手吧,不要去追求这刻意的痛,只为--贪恋她那片刻的温柔。一切,终究是个不切实际的梦。
爱,不曾发生终究没有人知道它将会发生,刻意追求--永远只能是个,错!道法自然,心会告诉你该如何去走,永远别强求、也别误解,想得太多还不如心随意走,快乐漫游!
爱,很难说出口,也别轻易脱口--它,是一个人对另一个人,幸福一生的承诺。没有人知道,下个路口会否有爱的影踪,那是绮丽、梦寐的影儿,是心颤、和谐的音儿--我喜欢你,你就是我今生的唯一!