日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > php教程 > Java泛型中通配符的使用

Java泛型中通配符的使用

來(lái)源:程序員人生   發(fā)布時(shí)間:2016-07-13 10:09:14 閱讀次數(shù):2492次

學(xué)習(xí)目標(biāo)

掌握通配符“?” 的使用
掌握受限泛型的設(shè)置
掌握泛型與子類繼承的限制

匹配任意類型的通配符

在開(kāi)發(fā)中對(duì)象的援用傳遞是最多見(jiàn)的,但是如果在泛型類的操作中,在進(jìn)行傳遞的時(shí)候泛型類型必須匹配才可以傳遞。否則是沒(méi)法傳遞的。
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("lx") ; // 設(shè)置內(nèi)容 fun(i) ; } public static void fun(Info<Object> temp){ // 接收Object泛型類型的Info對(duì)象 System.out.println("內(nèi)容:" + temp) ; } };

編譯時(shí)就出現(xiàn)毛病:

 泛型對(duì)象進(jìn)行援用傳遞的時(shí)候,類型必須1致。如果現(xiàn)在非要傳遞,則可以將fun方法中的泛型取消掉。以下所示:
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("WWWW") ; // 設(shè)置內(nèi)容 fun(i) ; } public static void fun(Info temp){ // 接收Object泛型類型的Info對(duì)象 System.out.println("內(nèi)容:" + temp) ; } };
發(fā)現(xiàn)有正告提示:

但不會(huì)影響程序的運(yùn)行:

以上確切完成了改進(jìn)的功能,但是,代碼似乎有些不是很妥當(dāng),畢竟之前已指定過(guò)泛型了。
如果使用?呢?以下所示:
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") ; // 設(shè)置內(nèi)容 fun(i) ; } public static void fun(Info<?> temp){ // 可以接收任意的泛型對(duì)象 System.out.println("內(nèi)容:" + temp) ; } };
能照舊運(yùn)行,而且不會(huì)有正告。
注意:如果使用?意味著可以接收任意的內(nèi)容,但是此內(nèi)容卻沒(méi)法直接使用<?> 修飾的泛型對(duì)象進(jìn)行修改。以下所示:
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") ; // 設(shè)置內(nèi)容 } };

發(fā)現(xiàn)有毛病,正告和運(yùn)行結(jié)果分別以下所示:



也就是說(shuō),在使用戶<?> 只能接收。但是不能修改。

受限泛型

之前設(shè)置泛型類型的時(shí)候,實(shí)際上都是可以任意設(shè)置的,只要是類就能夠設(shè)置。但是在Java的泛型中可以指定1個(gè)泛型的上限和下限。范圍的上限使用extends關(guān)鍵字聲明,表示參數(shù)化的類型多是所指定的類型,或是此類型的子類。而范圍下限使用super進(jìn)行聲明,表示參數(shù)化的類型多是所指定的類型,或是此類型的父類型,直至Object類。
設(shè)置上限:
  聲明對(duì)象:類名稱<? extends 類>  對(duì)象名稱
  定義類: [訪問(wèn)權(quán)限] 類名稱<泛型標(biāo)示 extends 類>{}
設(shè)置下限:
  聲明對(duì)象:類名稱<? super 類> 對(duì)象名稱
 定義類:[訪問(wèn)權(quán)限] 類名稱<泛型標(biāo)示 super 類>{}

設(shè)置上限

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的泛型對(duì)象 Info<Float> i2 = new Info<Float>() ; // 聲明Float的泛型對(duì)象 i1.setVar(30) ; // 設(shè)置整數(shù),自動(dòng)裝箱 i2.setVar(30.1f) ; // 設(shè)置小數(shù),自動(dòng)裝箱 fun(i1) ; fun(i2) ; } public static void fun(Info<? extends Number> temp){ // 只能接收Number及其Number的子類 System.out.print(temp + "、") ; } };


如果在方法中傳遞的不是泛型標(biāo)示不是Number及其子類,則會(huì)報(bào)錯(cuò),以下所示:
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的泛型對(duì)象 i1.setVar("hello") ; fun(i1) ; } public static void fun(Info<? extends Number> temp){ // 只能接收Number及其Number的子類 System.out.print(temp + "、") ; } };

在類中也能夠使用泛型,以下所示:
class Info<T extends Number>{ // 此處泛型只能是數(shù)字類型 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的泛型對(duì)象 } };
 如果現(xiàn)在在使用Info的時(shí)候設(shè)置成了String類型,則在編譯的時(shí)候就會(huì)出現(xiàn)毛病。
class Info<T extends Number>{ // 此處泛型只能是數(shù)字類型 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的泛型對(duì)象 } };

設(shè)置下限

當(dāng)使用的泛型只能在本類和父類類型利用的時(shí)候,就必須使用泛型的范圍下限配置
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的泛型對(duì)象 Info<Object> i2 = new Info<Object>() ; // 聲明Object的泛型對(duì)象 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 + "、") ; } };



如果現(xiàn)在使用了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的泛型對(duì)象 i1.setVar(30) ; fun(i1) ; } public static void fun(Info<? super String> temp){ // 只能接收String或Object類型的泛型 System.out.print(temp + "、") ; } };

解釋:泛型與子類繼承的限制
1個(gè)類的子類可以通過(guò)對(duì)象多態(tài)性,為其父類實(shí)例化,但是在泛型操作中,子類的泛型類型是沒(méi)法使用父類的泛型類型接收的,例如:Info<String> 不能使用Info<Object>接收。


實(shí)例以下:
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 ; } };

發(fā)現(xiàn)有毛病提示。

總結(jié):
1、使用?可以接收任意的泛型類型。
2、泛型的上限:? extends 類型。
3、泛型的下限用的不是太多。
4、了解為何泛型子類之間的繼承沒(méi)法直接轉(zhuǎn)換的緣由。



生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 麻豆成人av | www.久久精品 | 1024成人网色www | 海量av| 天天久久综合 | 视频二区日韩 | 亚洲综合无码一区二区 | 日本久久综合 | 久久91视频 | 亚洲激情在线 | 国产h在线观看 | 一区二区三区精品国产 | 国产欧美精品一区二区色综合 | av网站免费 | 国产毛片av| 亚洲永久精品国产 | www.亚洲一区 | 国产a自拍 | 国产精品成人一区二区网站软件 | 日韩经典一区二区 | 中文字幕高清 | 91一区二区 | 日韩欧美电影在线观看 | 99久久精品一区字幕狠狠婷婷 | 最近中文字幕mv在线资源 | 午夜影院毛片 | 成人午夜精品一区二区三区 | 久久成人国产 | 最近的中文字幕 | 日韩不卡一区 | 日韩精品极品在线观看 | 久久精品国产一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 性毛片视频 | 国内毛片毛片 | 亚洲二区在线视频 | 中文字幕国产一区二区三区 | 亚洲国产欧美在线 | 国产九色 | 亚洲综合欧美 | 国产美女久久 |