閱讀284 返回首頁    go 技術社區[雲棲]


Java泛型--泛型應用--泛型接口、泛型方法、泛型數組、泛型嵌套

1、泛型接口

1.1泛型接口的基本概念



1.2泛型接口實現的兩種方式

定義子類:在子類的定義上也聲明泛型類型
interface Info<T>{		// 在接口上定義泛型
	public T getVar() ;	// 定義抽象方法,抽象方法的返回值就是泛型類型
}
class InfoImpl<T> implements Info<T>{	// 定義泛型接口的子類
	private T var ;				// 定義屬性
	public InfoImpl(T var){		// 通過構造方法設置屬性內容
		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;		// 聲明接口對象
		i = new InfoImpl<String>("李興華") ;	// 通過子類實例化對象
		System.out.println("內容:" + i.getVar()) ;
	}
};
如果現在實現接口的子類不想使用泛型聲明,則在實現接口的時候直接指定好其具體的操作類型即可:
interface Info<T>{		// 在接口上定義泛型
	public T getVar() ;	// 定義抽象方法,抽象方法的返回值就是泛型類型
}
class InfoImpl implements Info<String>{	// 定義泛型接口的子類
	private String var ;				// 定義屬性
	public InfoImpl(String var){		// 通過構造方法設置屬性內容
		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;		// 聲明接口對象
		i = new InfoImpl("李興華") ;	// 通過子類實例化對象
		System.out.println("內容:" + i.getVar()) ;
	}
};

2、泛型方法

2.1定義泛型方法


class Demo{
	public <T> T fun(T t){			// 可以接收任意類型的數據
		return t ;					// 直接把參數返回
	}
};
public class GenericsDemo26{
	public static void main(String args[]){
		Demo d = new Demo()	;	// 實例化Demo對象
		String str = d.fun("李興華") ; //	傳遞字符串
		int i = d.fun(30) ;		// 傳遞數字,自動裝箱
		System.out.println(str) ;	// 輸出內容
		System.out.println(i) ;		// 輸出內容
	}
};

2.2通過泛型方法返回泛型類的實例

class Info<T extends Number>{	// 指定上限,隻能是數字類型
	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(30) ;
		System.out.println(i.getVar()) ;
	}
	public static <T extends Number> Info<T> fun(T param){
		Info<T> temp = new Info<T>() ;		// 根據傳入的數據類型實例化Info
		temp.setVar(param) ;		// 將傳遞的內容設置到Info對象的var屬性之中
		return temp ;	// 返回實例化對象
	}
};

2.3使用泛型統一傳入參數的類型

class Info<T>{	// 指定上限,隻能是數字類型
	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") ;		// 設置內容
		i2.setVar("李興華") ;		// 設置內容
		add(i1,i2) ;
	}
	public static <T> void add(Info<T> i1,Info<T> i2){
		System.out.println(i1.getVar() + " " + i2.getVar()) ;
	}
};
如果add方法中兩個泛型的類型不統一,則編譯會出錯。
class Info<T>{	// 指定上限,隻能是數字類型
	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(30) ;		// 設置內容
		i2.setVar("李興華") ;		// 設置內容
		add(i1,i2) ;
	}
	public static <T> void add(Info<T> i1,Info<T> i2){
		System.out.println(i1.getVar() + " " + i2.getVar()) ;
	}
};

3、泛型數組

public class GenericsDemo30{
	public static void main(String args[]){
		Integer i[] = fun1(1,2,3,4,5,6) ;	// 返回泛型數組
		fun2(i) ;
	}
	public static <T> T[] fun1(T...arg){	// 接收可變參數
		return arg ;			// 返回泛型數組
	}
	public static <T> void fun2(T param[]){	// 輸出
		System.out.print("接收泛型數組:") ;
		for(T t:param){
			System.out.print(t + "、") ;
		}
	}
};

4、泛型的嵌套設置

Demo類中的info屬性是Info類的這種屬性,Info類本身需要兩個泛型。
class Info<T,V>{		// 接收兩個泛型類型
	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指定兩個泛型類型
		i = new Info<String,Integer>("李興華",30) ;	 // 實例化Info對象
		d = new Demo<Info<String,Integer>>(i) ;	// 在Demo類中設置Info類的對象
		System.out.println("內容一:" + d.getInfo().getVar()) ;
		System.out.println("內容二:" + d.getInfo().getValue()) ;
	}
};


最後更新:2017-04-03 14:53:43

  上一篇:go 網絡就是個雞蛋
  下一篇:go 安裝ttf格式字體