了解下JAVA的JDK 1.5的Generics功能利用实例
你希望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;
Collection<Object>co=newArrayList<Object>();
fromArrayToCollection(oa,co);//TinferredtobeObject
String[]sa=newString;
Collection<String>cs=newArrayList<String>();
fromArrayToCollection(sa,cs);//TinferredtobeString
fromArrayToCollection(sa,co);//TinferredtobeObject
Integer[]ia=newInteger;
Float[]fa=newFloat;
Number[]na=newNumber;
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>;//notreallyallowed
List<?>[]lsa=newList<?>;//ok,arrayofunboundedwildcard
//type
Objecto=lsa;
Object[]oa=(Object[])o;
List<Integer>li=newArrayList<Integer>();
li.add(newInteger(3));
oa=li;//correct
//Strings=lsa.get(0);//run-timeerror-ClassCastException
//Strings=lsa.get(0);//runtimeerror,butwewerewarned
Strings=(String)lsa.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网页编程, 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 是一种使网页(Web Page)产生生动活泼画面的语言 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
页:
[1]