|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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网页编程, |
|