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)
近期熱門領域新鮮數據集匯總!