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
上一篇:
Linux係統中重啟tomcat的一般步驟
下一篇:
CORDIC 算法理論與實踐
WCF後續之旅(3): WCF Service Mode Layer 的中樞—Dispatcher
Gartner存儲魔力象限前四,阿裏雲如何成為“領頭羊”?
使用Ecs OpenAPI正確模式
在 CentOS 7 中使用 Sendmail 通過 PHP 發送郵件
浮點性(float)轉化為字符串類型 自定義實現和深入探討C++內部實現方法
一個合格的程序員應該讀過哪些書
API Demos 2.3 學習筆記 (17)-- Views->Tabs
使用阿裏雲虛擬主機時,網站文件上傳到哪個目錄下?
PostgreSQL schemaless 的實現(類mongodb collection)
近期熱門領域新鮮數據集匯總!