閱讀362 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java泛型--通配符

1、匹配任意的通配符

在開發中對象的引用傳遞是最常見的,如果在泛型類的操作中,在進行引用傳遞的時候泛型類型必須匹配才可以傳遞,否則是無法傳遞的。

class Info<T>{
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo12{
	public static void main(String args[]){
		Info<String> i = new Info<String>() ;		// 使用String為泛型類型
		i.setVar("MLDN") ;							// 設置內容
		fun(i) ;
	}
	public static void fun(Info<Object> temp){		// 接收Object泛型類型的Info對象
		System.out.println("內容:" + temp) ;
	}
};
編譯時錯誤:

class Info<T>{
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo13{
	public static void main(String args[]){
		Info<String> i = new Info<String>() ;		// 使用String為泛型類型
		i.setVar("MLDN") ;							// 設置內容
		fun(i) ;
	}
	public static void fun(Info temp){		// 接收Object泛型類型的Info對象
		System.out.println("內容:" + temp) ;
	}
};
以上確實完成了改進的功能,但是,代碼似乎有些不是太妥當,畢竟之前已經指定過泛型了。

class Info<T>{
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo14{
	public static void main(String args[]){
		Info<String> i = new Info<String>() ;		// 使用String為泛型類型
		i.setVar("MLDN") ;							// 設置內容
		fun(i) ;
	}
	public static void fun(Info<?> temp){		// 可以接收任意的泛型對象
		System.out.println("內容:" + temp) ;
	}
};
如果使用?意味著可以接受任意的內容,但是此內容卻無法直接使用<?>修飾的泛型對象進行修改。

class Info<T>{
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo15{
	public static void main(String args[]){
		Info<?> i = new Info<String>() ;		// 使用String為泛型類型
		i.setVar("MLDN") ;							// 設置內容
	}
};
編譯時錯誤:

2、受限泛型


2.1設置上限

class Info<T>{
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo17{
	public static void main(String args[]){
		Info<Integer> i1 = new Info<Integer>() ;		// 聲明Integer的泛型對象
		Info<Float> i2 = new Info<Float>() ;			// 聲明Float的泛型對象
		i1.setVar(30) ;									// 設置整數,自動裝箱
		i2.setVar(30.1f) ;								// 設置小數,自動裝箱
		fun(i1) ;
		fun(i2) ;
	}
	public static void fun(Info<? extends Number> temp){	// 隻能接收Number及其Number的子類
		System.out.print(temp + "、") ;
	}
};
錯誤代碼:
class Info<T>{
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo18{
	public static void main(String args[]){
		Info<String> i1 = new Info<String>() ;		// 聲明String的泛型對象
		i1.setVar("hello") ;
		fun(i1) ;
	}
	public static void fun(Info<? extends Number> temp){	// 隻能接收Number及其Number的子類
		System.out.print(temp + "、") ;
	}
};
在類中使用:
class Info<T extends Number>{	// 此處泛型隻能是數字類型
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo19{
	public static void main(String args[]){
		Info<Integer> i1 = new Info<Integer>() ;		// 聲明Integer的泛型對象
	}
};
如果現在在使用Info的時候設置成了String類型,則在編譯的時候將出現錯誤:
class Info<T extends Number>{	// 此處泛型隻能是數字類型
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo20{
	public static void main(String args[]){
		Info<String> i1 = new Info<String>() ;		// 聲明Integer的泛型對象
	}
};

2.2設置下限

當使用的泛型隻能在本類及其父類類型上應用的時候,可以使用泛型的範圍下限配置。

class Info<T>{
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo21{
	public static void main(String args[]){
		Info<String> i1 = new Info<String>() ;		// 聲明String的泛型對象
		Info<Object> i2 = new Info<Object>() ;		// 聲明Object的泛型對象
		i1.setVar("hello") ;
		i2.setVar(new Object()) ;
		fun(i1) ;
		fun(i2) ;
	}
	public static void fun(Info<? super String> temp){	// 隻能接收String或Object類型的泛型
		System.out.print(temp + "、") ;
	}
};
如果現在使用Integer作為泛型的類型,不能滿足泛型下限。編譯會出錯:

class Info<T>{
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo22{
	public static void main(String args[]){
		Info<Integer> i1 = new Info<Integer>() ;		// 聲明Integer的泛型對象
		i1.setVar(30) ;
		fun(i1) ;
	}
	public static void fun(Info<? super String> temp){	// 隻能接收String或Object類型的泛型
		System.out.print(temp + "、") ;
	}
};

3、泛型與子類繼承的限製


class Info<T>{
	private T var ;		// 定義泛型變量
	public void setVar(T var){
		this.var = var ;
	}
	public T getVar(){
		return this.var ;
	}
	public String toString(){	// 直接打印
		return this.var.toString() ;
	}
};
public class GenericsDemo23{
	public static void main(String args[]){
		Info<String> i1 = new Info<String>() ;		// 泛型類型為String
		Info<Object> i2 = null ;
		i2 = i1 ;
	}
};


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

  上一篇:go Linux係統中重啟tomcat的一般步驟
  下一篇:go CORDIC 算法理論與實踐