JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0。这说明Java已经有大幅度的变化。本文将讲解JDK5.0支持的新功能-----Java的泛型. 
1、Java泛型

其实Java的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1、str2的值是可变的。而泛型也是一样的,这样写class Java_Generics<K,V>,这里边的K和V就象方法中的参数str1和str2,也是可变。
编写泛型类要注意:

1) 在定义一个泛型类的时候,在 “<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K” , “V”不代表值,而是表示类型。

2) 实例化泛型对象的时候,一定要在类名后面指定类型参数的值(类型),一共要有两次书写。例如:

TestGen<String,String> t=new TestGen<String,String>();

3) 泛型中<K extends Object>,extends并不代表继承,它是类型范围限制。
普通泛型



Java代码



classPoint<T>{ // 此处可以随便写标识符号,T是type的简称
privateT var ; // var的类型由T指定,即:由外部指定
publicT getVar(){ // 返回值的类型由外部决定
return
}
publicvoidsetVar(T var){ // 设置的类型也由外部决定
this.var = var ;
}
};
publicclass
publicstaticvoid
newPoint<String>() ; // 里面的var类型为String类型
"it") ; // 设置字符串
// 取得字符串的长度
}
};
----------------------------------------------------------
classNotepad<K,V>{ // 此处指定了两个泛型类型
privateK key ; // 此变量的类型由外部决定
privateV value ; // 此变量的类型由外部决定
public
returnthis.key ;
}
public
returnthis.value ;
}
publicvoid
this.key = key ;
}
publicvoid
this.value = value ;
}
};
publicclass
publicstaticvoid
null; // 定义两个泛型类型的对象
newNotepad<String,Integer>() ; // 里面的key为String,value为Integer
"汤姆") ; // 设置第一个内容
20) ; // 设置第二个内容
"姓名;" + t.getKey()) ; // 取得信息
",年龄;" + t.getValue()) ; // 取得信息

}
};


通配符



Java代码



class
privateT var ; // 定义泛型变量
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
publicString toString(){ // 直接打印
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
newInfo<String>() ; // 使用String为泛型类型
"it") ; // 设置内容
fun(i) ;
}
publicstaticvoidfun(Info<?> temp){ // 可以接收任意的泛型对象
"内容:"
}
};


受限泛型



Java代码



class
privateT var ; // 定义泛型变量
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
publicString toString(){ // 直接打印
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
newInfo<Integer>() ; // 声明Integer的泛型对象
newInfo<Float>() ; // 声明Float的泛型对象
30) ; // 设置整数,自动装箱
30.1f) ; // 设置小数,自动装箱
fun(i1) ;
fun(i2) ;
}
publicstaticvoidfun(Info<?extendsNumber> temp){ // 只能接收Number及其Number的子类
"、") ;
}
};
----------------------------------------------------------
class
privateT var ; // 定义泛型变量
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
publicString toString(){ // 直接打印
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
newInfo<String>() ; // 声明String的泛型对象
newInfo<Object>() ; // 声明Object的泛型对象
"hello") ;
new
fun(i1) ;
fun(i2) ;
}
publicstaticvoidfun(Info<?superString> temp){ // 只能接收String或Object类型的泛型
"、") ;
}
};


泛型无法向上转型



Java代码



class
privateT var ; // 定义泛型变量
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
publicString toString(){ // 直接打印
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
newInfo<String>() ; // 泛型类型为String
null
//这句会出错 incompatible types
}
};


泛型接口



Java代码



interfaceInfo<T>{ // 在接口上定义泛型
publicT getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
}
classInfoImpl<T>implementsInfo<T>{ // 定义泛型接口的子类
privateT var ; // 定义属性
publicInfoImpl(T var){ // 通过构造方法设置属性内容
this.setVar(var) ;
}
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
};
publicclass
publicstaticvoid
null; // 声明接口对象
newInfoImpl<String>("汤姆") ; // 通过子类实例化对象
"内容:"
}
};
----------------------------------------------------------
interfaceInfo<T>{ // 在接口上定义泛型
publicT getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
}
classInfoImplimplementsInfo<String>{ // 定义泛型接口的子类
privateString var ; // 定义属性
publicInfoImpl(String var){ // 通过构造方法设置属性内容
this.setVar(var) ;
}
publicvoid
this.var = var ;
}
public
returnthis.var ;
}
};
publicclass
publicstaticvoid
null; // 声明接口对象
newInfoImpl("汤姆") ; // 通过子类实例化对象
"内容:"
}
};


泛型方法



Java代码



class
public<T> T fun(T t){ // 可以接收任意类型的数据
returnt ; // 直接把参数返回
}
};
publicclass
publicstaticvoid
newDemo() ; // 实例化Demo对象
"汤姆") ; // 传递字符串
inti = d.fun(30) ; // 传递数字,自动装箱
// 输出内容
// 输出内容
}
};


通过泛型方法返回泛型类型实例



Java代码



classInfo<TextendsNumber>{ // 指定上限,只能是数字类型
privateT var ; // 此类型由外部决定
public
returnthis.var ;
}
publicvoid
this.var = var ;
}
publicString toString(){ // 覆写Object类中的toString()方法
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
30) ;
System.out.println(i.getVar()) ;
}
publicstatic<TextendsNumber> Info<T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定
newInfo<T>() ; // 根据传入的数据类型实例化Info
// 将传递的内容设置到Info对象的var属性之中
returntemp ; // 返回实例化对象
}
};


使用泛型统一传入的参数类型



Java代码



classInfo<T>{ // 指定上限,只能是数字类型
privateT var ; // 此类型由外部决定
public
returnthis.var ;
}
publicvoid
this.var = var ;
}
publicString toString(){ // 覆写Object类中的toString()方法
returnthis.var.toString() ;
}
};
publicclass
publicstaticvoid
new
new
"HELLO") ; // 设置内容
"汤姆") ; // 设置内容
add(i1,i2) ;
}
publicstatic<T>void
" "
}
};


泛型数组



Java代码



publicclass
publicstaticvoid
1,2,3,4,5,6) ; // 返回泛型数组
fun2(i) ;
}
publicstatic<T> T[] fun1(T...arg){ // 接收可变参数
returnarg ; // 返回泛型数组
}
publicstatic<T>voidfun2(T param[]){ // 输出
"接收泛型数组:") ;
for(T t:param){
"、") ;
}
}
};


泛型的嵌套设置



Java代码



classInfo<T,V>{ // 接收两个泛型类型
private
private
public
this.setVar(var) ;
this.setValue(value) ;
}
publicvoid
this.var = var ;
}
publicvoid
this.value = value ;
}
public
returnthis.var ;
}
public
returnthis.value ;
}
};
class
private
public
this.setInfo(info) ;
}
publicvoid
this.info = info ;
}
public
returnthis.info ;
}
};
publicclass
publicstaticvoid
null; // 将Info作为Demo的泛型类型
null; // Info指定两个泛型类型
newInfo<String,Integer>("汤姆",30) ; // 实例化Info对象
newDemo<Info<String,Integer>>(i) ; // 在Demo类中设置Info类的对象
"内容一:"
"内容二:"
}
};