仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 484|回复: 11
打印 上一主题 下一主题

[学习教程] 了解下JAVA的JDK 1.5的Generics功效利用实例

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-18 11:28:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你希望java的IDE整合。这个是没有必要的,重要的是你理解java有多深以及怎么组织你的代码,即使没有IDE,代码照样能够编译运行的。
Generics是JDK1.5一个最主要的特征,次要用来处置Collection。
以下代码在JDK1.5调试经由过程。
代码实例1:Demo.java
packagemaoxiang.examples.jdk15.generics;
importjava.util.ArrayList;
importjava.util.Collection;
importjava.util.HashMap;
importjava.util.LinkedList;
importjava.util.List;
importjava.util.Map;
/**
*@author毛翔
*
*演示怎样利用Generics特征。代码来自于Generics教程:
*http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
*
*Generics相似于C++中的模板。
*区分:
*1.
*2.
*/
publicclassDemo{
 publicstaticvoidmain(String[]args){}
 /**
 *最复杂的用法
 */
 publicvoidTest1(){
  //之前的用法
  //ListmyIntList=newLinkedList();//1
  //myIntList.add(newInteger(0));//2
  //Integerx=(Integer)myIntList.iterator().next();//3必要强制转换
  //1.5的用法
  List<Integer>myIntList=newLinkedList<Integer>();//1’
  myIntList.add(newInteger(0));//2’
  Integerx=myIntList.iterator().next();//3’
 }
 /**
 *匿名字符的用法
 */
 publicvoidTest2(){
  List<Circle>list=newArrayList<Circle>();
  //经由过程匿名字符打印一个汇合
  Wildcards(list);
  Wildcards1();
  /*
  *假如Wildcards2界说为Wildcards2(List<Shape>shapes)
  *以下挪用毛病
  */
  Wildcards2(list);
 }
 publicvoidWildcards(Collection<?>c){
  //之前的用法
  //Iteratori=c.iterator();
  //for(intk=0;k<c.size();k++){
  //
  log(i.next());
 //}
 //1.5的用法
 //Collection<?>c暗示
 for(Objecte:c){
  log(e);
 }
}
publicvoidWildcards1(){
 //Collection<?>c=newArrayList<String>();
 //c.add(newObject());//compiletimeerror
 //以上为毛病的用法,由于不克不及断定c的范例,不克不及利用add,但get能够。准确的用法以下:
 ArrayList<String>c=newArrayList<String>();
 c.add("test");
 List<?>list=c;
 log(c.get(0));
}
publicvoidWildcards2(List<?extendsShape>shapes){
 //List<Shape>shapes界说只能承受List<Shape>shapes,也不克不及承受List<Circle>
 for(Shapes:shapes){
  s.draw();
 }
 //以下写法毛病,由于为参数声名为extendsShpape,没法断定Rectangle为Shape子类,属于不平安挪用
 //shapes.add(0,newRectangle());
 Map<String,Driver>allDrivers=newHashMap<String,Driver>();
 Census.addRegistry(allDrivers);
 //以下写法同意,由于drivers明白界说,
 List<Driver>drivers=newArrayList<Driver>();
 Census.add(drivers);
}
/**
*GenericMethods的用法
*
*/
publicvoidTest3(){
 //合用于各类范例的函数
 Object[]oa=newObject[100];
 Collection<Object>co=newArrayList<Object>();
 fromArrayToCollection(oa,co);//TinferredtobeObject
 String[]sa=newString[100];
 Collection<String>cs=newArrayList<String>();
 fromArrayToCollection(sa,cs);//TinferredtobeString
 fromArrayToCollection(sa,co);//TinferredtobeObject
 Integer[]ia=newInteger[100];
 Float[]fa=newFloat[100];
 Number[]na=newNumber[100];
 Collection<Number>cn=newArrayList<Number>();
 fromArrayToCollection(ia,cn);//TinferredtobeNumber
 fromArrayToCollection(fa,cn);//TinferredtobeNumber
 fromArrayToCollection(na,cn);//TinferredtobeNumber
 fromArrayToCollection(na,co);//TinferredtobeObject
 //test.fromArrayToCollection(na,cs);//毛病用法
}
public<T>voidfromArrayToCollection(T[]a,Collection<T>c){
 for(To:a){
  //假如参数界说为Collection<?>c以下写法毛病
  c.add(o);//compiletimeerror
 }
}
/**
*generics嵌套用法
*@paramshapes
*/
publicvoiddrawAll(List<?extendsShape>shapes){
 List<List<?extendsShape>>history=newArrayList<List<?extendsShape>>();
 history.add(shapes);
 for(Shapes:shapes){
  s.draw();
 }
}
/**
*
*
*/
publicvoidTest4(){
 List<String>l1=newArrayList<String>();
 List<Integer>l2=newArrayList<Integer>();
 System.out.print(l1.getClass()==l2.getClass());
 //打印为true,
}
/**
*毛病用法
*/
publicvoidTest5(){
 Collectioncs=newArrayList<String>();
 //以下为毛病用法
 //if(csinstanceofCollection<String>){}//illegal
 //以下为告诫用法
 //Collection<String>cstr=(Collection<String>)cs;//unchecked
 //warning
}
publicvoidTest6(){
//毛病用法
//List<String>[]lsa=newList<String>[10];//notreallyallowed
List<?>[]lsa=newList<?>[10];//ok,arrayofunboundedwildcard
//type
Objecto=lsa;
Object[]oa=(Object[])o;
List<Integer>li=newArrayList<Integer>();
li.add(newInteger(3));
oa[1]=li;//correct
//Strings=lsa[1].get(0);//run-timeerror-ClassCastException
//Strings=lsa[1].get(0);//runtimeerror,butwewerewarned
Strings=(String)lsa[1].get(0);//runtimeerror,butcastis
//explicit
}
publicvoidTest7(){
 Sink<Object>s=null;
 Sink<String>s1=null;
 Collection<String>cs=null;
 Stringstr=writeAll(cs,s1);
 //Stringstr=writeAll(cs,s);//有效挪用
 Objectobj=writeAll1(cs,s);//准确的挪用
 str=writeAll2(cs,s1);//准确的挪用
}
public<T>TwriteAll(Collection<T>coll,Sink<T>snk){
 Tlast=null;
 for(Tt:coll){
  last=t;
  snk.flush(last);
 }
 returnlast;
}
public<T>TwriteAll1(Collection<?extendsT>coll,Sink<T>snk){
 Tlast=null;
 for(Tt:coll){
  last=t;
  snk.flush(last);
 }
 returnlast;
}
public<T>TwriteAll2(Collection<T>coll,Sink<?superT>snk){
 Tlast=null;
 for(Tt:coll){
  last=t;
  snk.flush(last);
 }
 returnlast;
}
//打印
privatevoidlog(Objectob){
 System.out.print(ob);
}
}
//帮助界说
abstractclassShape{
 publicabstractvoiddraw();
}
classCircleextendsShape{
 privateintx,y,radius;
 publicvoiddraw(){
 }
}
classRectangleextendsShape{
 privateintx,y,width,height;
 publicvoiddraw(){
 }
}
classPerson{}
classDriverextendsPerson{}
classCensus{
 publicstaticvoidaddRegistry(Map<String,?extendsPerson>registry){
}
publicstaticvoidadd(List<?extendsPerson>persons){
}
}
classCollections{
publicstatic<T,SextendsT>voidcopy(List<T>dest,List<S>src){
}
}
<p>
轮性能微软曾做过一个例子,就是同一个项目用java和.net网页编程来作,结果开发周期,.net网页编程是java的一半,性能java是.net网页编程的十分之一,代码量java是.net网页编程的三倍。呵呵,这说明了什么,.net网页编程的全方位比java好。但是有的人说.net网页编程不能跨平台,这个问题我和我同学曾讨论过,都认为微软的.net网页编程很可能早都可以跨平台了,但是微软为了保护他们的操作系统,所以才没有推出跨平台的.net网页编程,只是推出了跨语言的.net网页编程,
乐观 该用户已被删除
沙发
发表于 2015-1-20 10:36:21 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
变相怪杰 该用户已被删除
板凳
发表于 2015-1-29 06:46:36 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
老尸 该用户已被删除
地板
发表于 2015-2-2 22:34:25 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
不帅 该用户已被删除
5#
发表于 2015-2-6 02:04:23 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
只想知道 该用户已被删除
6#
发表于 2015-2-11 05:35:26 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
兰色精灵 该用户已被删除
7#
发表于 2015-2-11 16:30:06 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
admin 该用户已被删除
8#
发表于 2015-2-25 21:59:03 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
金色的骷髅 该用户已被删除
9#
发表于 2015-2-27 18:20:39 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
活着的死人 该用户已被删除
10#
发表于 2015-3-9 11:02:18 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
精灵巫婆 该用户已被删除
11#
发表于 2015-3-16 21:44:35 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
海妖 该用户已被删除
12#
发表于 2015-3-23 03:40:46 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 05:20

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表