Java泛型的其他應(yīng)用——泛型接口、泛型方法、泛型數(shù)組以及泛型的嵌套設(shè)置
來源:程序員人生 發(fā)布時(shí)間:2016-07-11 15:50:15 閱讀次數(shù):3326次
學(xué)習(xí)目標(biāo)
掌握泛型接口的使用
掌握泛型方法的定義的及使用
掌握泛型數(shù)組的使用
掌握泛型的嵌套設(shè)置
之前所有的操作都是在類中直接使用泛型操作的,那末,對(duì)Java來講,也能夠直接在接口中定義及使用泛型。
定義泛型接口
在JDK1.5以后,不單單可以聲明泛型類,也能夠聲明泛型接口,聲明泛型接口和聲明泛型類的語法類似,也是在接口名稱后面加上<T>,以下格式所示:
[訪問權(quán)限] interface 接口名稱<泛型標(biāo)識(shí)>{}
interface Info<T>{ // 在接口上定義泛型
public T getVar() ; // 定義抽象方法,抽象方法的返回值就是泛型類型
}
如果現(xiàn)在1個(gè)子類實(shí)現(xiàn)此接口但是沒有進(jìn)行正確的實(shí)現(xiàn),則在編譯時(shí)會(huì)出現(xiàn)正告信息。
interface Info<T>{
public T getVar();
}
class InfoImpl implements Info{
public String getVar(){
return null;
}
}
以上的操作,其實(shí)不是1個(gè)子類實(shí)現(xiàn)泛型的最好操作,最好在實(shí)現(xiàn)的時(shí)候也指定具體的泛型類型。
泛型接口實(shí)現(xiàn)的兩種方式
定義子類:在子類的定義上在也聲明泛型類型。
interface Info<T>{ // 在接口上定義泛型
public T getVar() ; // 定義抽象方法,抽象方法的返回值就是泛型類型
}
class InfoImpl<T> implements Info<T>{ // 定義泛型接口的子類
private T var ; // 定義屬性
public InfoImpl(T var){ // 通過構(gòu)造方法設(shè)置屬性內(nèi)容
this.setVar(var) ;
}
public void setVar(T var){
this.var = var ;
}
public T getVar(){
return this.var ;
}
};
public class GenericsDemo24{
public static void main(String arsg[]){
Info<String> i = null; // 聲明接口對(duì)象
i = new InfoImpl<String>("劉勛") ; // 通過子類實(shí)例化對(duì)象
System.out.println("內(nèi)容:" + i.getVar()) ;
}
};
如果現(xiàn)在實(shí)現(xiàn)接口的子類不想使用泛型聲明,則在實(shí)現(xiàn)接口的時(shí)候直接直接指定好具體的操作類型便可。
interface Info<T>{ // 在接口上定義泛型
public T getVar() ; // 定義抽象方法,抽象方法的返回值就是泛型類型
}
class InfoImpl implements Info<String>{ // 定義泛型接口的子類
private String var ; // 定義屬性
public InfoImpl(String var){ // 通過構(gòu)造方法設(shè)置屬性內(nèi)容
this.setVar(var) ;
}
public void setVar(String var){
this.var = var ;
}
public String getVar(){
return this.var ;
}
};
public class GenericsDemo25{
public static void main(String arsg[]){
Info i = null; // 聲明接口對(duì)象
i = new InfoImpl("李興華") ; // 通過子類實(shí)例化對(duì)象
System.out.println("內(nèi)容:" + i.getVar()) ;
}
};
對(duì)后者,常常使用。
泛型方法
之前的所有泛型除可以為類中的屬性指定類型以外,也能夠定義方法,泛型方法所在的類中是不是是泛型類本身是沒有任何關(guān)系的。
定義泛型方法
泛型方法可以定義泛型參數(shù),此時(shí),參數(shù)的類型就是傳入數(shù)據(jù)的類型,使用以下格式定義泛型方法。
泛型方法的簡單定義:
[訪問權(quán)限]<泛型標(biāo)示> 泛型標(biāo)示 方法名稱([泛型標(biāo)示 參數(shù)名稱])
程序?qū)嵗韵拢?/span>
class Demo{
public <T> T fun(T t){ // 可以接收任意類型的數(shù)據(jù)
return t ; // 直接把參數(shù)返回
}
};
public class GenericsDemo26{
public static void main(String args[]){
Demo d = new Demo() ; // 實(shí)例化Demo對(duì)象
String str = d.fun("劉勛") ; // 傳遞字符串
int i = d.fun(24) ; // 傳遞數(shù)字,自動(dòng)裝箱
System.out.println(str) ; // 輸出內(nèi)容
System.out.println(i) ; // 輸出內(nèi)容
}
};
通過泛型方法返回泛型類的實(shí)例
由于之前的代碼中可以發(fā)現(xiàn),只要在方法中定義了泛型操作,則可以傳遞任意的數(shù)據(jù)類型。
程序示例以下:
class Info<T extends Number>{ // 指定上限,只能是數(shù)字類型
private T var ; // 此類型由外部決定
public T getVar(){
return this.var ;
}
public void setVar(T var){
this.var = var ;
}
public String toString(){ // 覆寫Object類中的toString()方法
return this.var.toString() ;
}
};
public class GenericsDemo27{
public static void main(String args[]){
Info<Integer> i = fun(20) ;
System.out.println(i.getVar()) ;
}
public static <T extends Number> Info<T> fun(T param){
Info<T> temp = new Info<T>() ; // 根據(jù)傳入的數(shù)據(jù)類型實(shí)例化Info
temp.setVar(param) ; // 將傳遞的內(nèi)容設(shè)置到Info對(duì)象的var屬性當(dāng)中
return temp ; // 返回實(shí)例化對(duì)象
}
};
使用泛型統(tǒng)1傳入?yún)?shù)的類型
如果在1些操作中,希望傳遞的泛型類型是1致的類型。
實(shí)例以下:
class Info<T>{ // 指定上限,只能是數(shù)字類型
private T var ; // 此類型由外部決定
public T getVar(){
return this.var ;
}
public void setVar(T var){
this.var = var ;
}
public String toString(){ // 覆寫Object類中的toString()方法
return this.var.toString() ;
}
};
public class GenericsDemo28{
public static void main(String args[]){
Info<String> i1 = new Info<String>() ;
Info<String> i2 = new Info<String>() ;
i1.setVar("HELLO") ; // 設(shè)置內(nèi)容
i2.setVar("liuxun") ; // 設(shè)置內(nèi)容
add(i1,i2) ;
}
public static <T> void add(Info<T> i1,Info<T> i2){
System.out.println(i1.getVar() + " " + i2.getVar()) ;
}
};

但是如果傳遞到add定單中的兩個(gè)泛型類型不統(tǒng)1,則會(huì)出現(xiàn)毛病。
class Info<T>{ // 指定上限,只能是數(shù)字類型
private T var ; // 此類型由外部決定
public T getVar(){
return this.var ;
}
public void setVar(T var){
this.var = var ;
}
public String toString(){ // 覆寫Object類中的toString()方法
return this.var.toString() ;
}
};
public class GenericsDemo29{
public static void main(String args[]){
Info<Integer> i1 = new Info<Integer>() ;
Info<String> i2 = new Info<String>() ;
i1.setVar(20) ; // 設(shè)置內(nèi)容
i2.setVar("liuxun") ; // 設(shè)置內(nèi)容
add(i1,i2) ; // X :此處由于類型不1致就會(huì)出現(xiàn)毛病
}
public static <T> void add(Info<T> i1,Info<T> i2){
System.out.println(i1.getVar() + " " + i2.getVar()) ;
}
};
泛型數(shù)組
使用泛型方法的時(shí)候,也能夠傳遞或返回1個(gè)泛型數(shù)組。
程序以下:
public class GenericsDemo30{
public static void main(String args[]){
Integer i[] = fun1(1,2,3,4,5,6) ; // 返回泛型數(shù)組
fun2(i) ;
}
public static <T> T[] fun1(T...arg){ // 接收可變參數(shù)
return arg ; // 返回泛型數(shù)組
}
public static <T> void fun2(T param[]){ // 輸出
System.out.print("接收泛型數(shù)組:") ;
for(T t:param){
System.out.print(t + "、") ;
}
}
};

注意:... 表示可變參數(shù) ,可以傳遞任意多的參數(shù),可以當(dāng)數(shù)組進(jìn)行處理。
泛型的嵌套設(shè)置
之前所說的全部泛型操作,都是直接通過實(shí)例化類的時(shí)候完成,固然,在設(shè)置的時(shí)候也會(huì)看見嵌套的設(shè)置情勢。
程序?qū)嵗韵拢?/span>
class Info<T,V>{ // 接收兩個(gè)泛型類型
private T var ;
private V value ;
public Info(T var,V value){
this.setVar(var) ;
this.setValue(value) ;
}
public void setVar(T var){
this.var = var ;
}
public void setValue(V value){
this.value = value ;
}
public T getVar(){
return this.var ;
}
public V getValue(){
return this.value ;
}
};
class Demo<S>{
private S info ;
public Demo(S info){
this.setInfo(info) ;
}
public void setInfo(S info){
this.info = info ;
}
public S getInfo(){
return this.info ;
}
};
public class GenericsDemo31{
public static void main(String args[]){
Demo<Info<String,Integer>> d = null ; // 將Info作為Demo的泛型類型
Info<String,Integer> i = null ; // Info指定兩個(gè)泛型類型
i = new Info<String,Integer>("劉勛",20) ; // 實(shí)例化Info對(duì)象
d = new Demo<Info<String,Integer>>(i) ; // 在Demo類中設(shè)置Info類的對(duì)象
System.out.println("內(nèi)容1:" + d.getInfo().getVar()) ;
System.out.println("內(nèi)容2:" + d.getInfo().getValue()) ;
}
};
總結(jié):
1、泛型在接口上可以定義,及其實(shí)現(xiàn)的方式。
2、泛型在使用的時(shí)候可以進(jìn)行嵌套的操作,只要根據(jù)其操作語法便可。
3、泛型方法上使用泛型標(biāo)記的時(shí)候需要先聲明,一樣可以指定其操作的上限和下限。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)