日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

泛型中的 T、E、K、V,还记得嘛?

發(fā)布時間:2024/1/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 泛型中的 T、E、K、V,还记得嘛? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方“碼農突圍”,馬上關注

這里是碼農充電第一站,回復“666”,獲取一份專屬大禮包 真愛,請設置“星標”或點個“在看”

來源:juejin.im/post/5d5789d26fb9a06ad0056bd9

  • 前言

  • 泛型帶來的好處

  • 泛型中通配符

    • 常用的 T,E,K,V,?

    • ?無界通配符

    • 上界通配符 < ? extends E>

    • 下界通配符 < ? super E>

    • ?和 T 的區(qū)別

  • Class和 Class區(qū)別

  • 小結


前言

Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時類型安全檢測機制,該機制允許開發(fā)者在編譯時檢測到非法的類型。

泛型的本質是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。

泛型帶來的好處

在沒有泛型的情況的下,通過對類型 Object 的引用來實現(xiàn)參數(shù)的“任意化”,“任意化”帶來的缺點是要做顯式的強制類型轉換,而這種轉換是要求開發(fā)者對實際參數(shù)類型可以預知的情況下進行的。對于強制類型轉換錯誤的情況,編譯器可能不提示錯誤,在運行的時候才出現(xiàn)異常,這是本身就是一個安全隱患。

那么泛型的好處就是在編譯的時候能夠檢查類型安全,并且所有的強制轉換都是自動和隱式的。

public?class?GlmapperGeneric<T>?{private?T?t;public?void?set(T?t)?{?this.t?=?t;?}public?T?get()?{?return?t;?}public?static?void?main(String[]?args)?{//?do?nothing}/***?不指定類型*/public?void?noSpecifyType(){GlmapperGeneric?glmapperGeneric?=?new?GlmapperGeneric();glmapperGeneric.set("test");//?需要強制類型轉換String?test?=?(String)?glmapperGeneric.get();System.out.println(test);}/***?指定類型*/public?void?specifyType(){GlmapperGeneric<String>?glmapperGeneric?=?new?GlmapperGeneric();glmapperGeneric.set("test");//?不需要強制類型轉換String?test?=?glmapperGeneric.get();System.out.println(test);} }

上面這段代碼中的 specifyType 方法中 省去了強制轉換,可以在編譯時候檢查類型安全,可以用在類,方法,接口上。

泛型中通配符

我們在定義泛型類,泛型方法,泛型接口的時候經(jīng)常會碰見很多不同的通配符,比如 T,E,K,V 等等,這些通配符又都是什么意思呢?

常用的 T,E,K,V,?

本質上這些個都是通配符,沒啥區(qū)別,只不過是編碼時的一種約定俗成的東西。比如上述代碼中的 T ,我們可以換成 A-Z 之間的任何一個 字母都可以,并不會影響程序的正常運行,但是如果換成其他的字母代替 T ,在可讀性上可能會弱一些。通常情況下,T,E,K,V,?是這樣約定的:

  • ?表示不確定的 java 類型

  • T (type) 表示具體的一個java類型

  • K V (key value) 分別代表java鍵值中的Key Value

  • E (element) 代表Element

?無界通配符

先從一個小例子看起,原文在 這里 。

我有一個父類 Animal 和幾個子類,如狗、貓等,現(xiàn)在我需要一個動物的列表,我的第一個想法是像這樣的:

List<Animal>?listAnimals

但是老板的想法確實這樣的:

List<??extends?Animal>?listAnimals

為什么要使用通配符而不是簡單的泛型呢?通配符其實在聲明局部變量時是沒有什么意義的,但是當你為一個方法聲明一個參數(shù)時,它是非常重要的。

static?int?countLegs?(List<??extends?Animal?>?animals?)?{int?retVal?=?0;for?(?Animal?animal?:?animals?){retVal?+=?animal.countLegs();}return?retVal; }static?int?countLegs1?(List<?Animal?>?animals?){int?retVal?=?0;for?(?Animal?animal?:?animals?){retVal?+=?animal.countLegs();}return?retVal; }public?static?void?main(String[]?args)?{List<Dog>?dogs?=?new?ArrayList<>();//?不會報錯countLegs(?dogs?);//?報錯countLegs1(dogs); }

當調用 countLegs1 時,就會飄紅,提示的錯誤信息如下:

圖片

所以,對于不確定或者不關心實際要操作的類型,可以使用無限制通配符(尖括號里一個問號,即 <?> ),表示可以持有任何類型。像 countLegs 方法中,限定了上屆,但是不關心具體類型是什么,所以對于傳入的 Animal 的所有子類都可以支持,并且不會報錯。而 countLegs1 就不行。

上界通配符 < ? extends E>

上屆:用 extends 關鍵字聲明,表示參數(shù)化的類型可能是所指定的類型,或者是此類型的子類。

在類型參數(shù)中使用 extends 表示這個泛型中的參數(shù)必須是 E 或者 E 的子類,這樣有兩個好處:

  • 如果傳入的類型不是 E 或者 E 的子類,編譯不成功

  • 泛型中可以使用 E 的方法,要不然還得強轉成 E 才能使用

private?<K?extends?A,?E?extends?B>?E?test(K?arg1,?E?arg2){E?result?=?arg2;arg2.compareTo(arg1);//.....return?result; }

類型參數(shù)列表中如果有多個類型參數(shù)上限,用逗號分開

下界通配符 < ? super E>

下界: 用 super 進行聲明,表示參數(shù)化的類型可能是所指定的類型,或者是此類型的父類型,直至 Object

在類型參數(shù)中使用 super 表示這個泛型中的參數(shù)必須是 E 或者 E 的父類。

private?<T>?void?test(List<??super?T>?dst,?List<T>?src){for?(T?t?:?src)?{dst.add(t);} }public?static?void?main(String[]?args)?{List<Dog>?dogs?=?new?ArrayList<>();List<Animal>?animals?=?new?ArrayList<>();new?Test3().test(animals,dogs); } //?Dog?是?Animal?的子類 class?Dog?extends?Animal?{}

dst 類型 “大于等于” src 的類型,這里的“大于等于”是指 dst 表示的范圍比 src 要大,因此裝得下 dst 的容器也就能裝 src 。

?和 T 的區(qū)別

圖片

?和 T 都表示不確定的類型,區(qū)別在于我們可以對 T 進行操作,但是對 ?不行,比如如下這種 :

//?可以 T?t?=?operate();//?不可以 ?car = operate();

簡單總結下:

T 是一個 確定的 類型,通常用于泛型類和泛型方法的定義,?是一個 不確定 的類型,通常用于泛型方法的調用代碼和形參,不能用于定義類和泛型方法。

區(qū)別1:通過 T 來 確保 泛型參數(shù)的一致性

//?通過?T?來?確保?泛型參數(shù)的一致性 public?<T?extends?Number>?void test(List<T>?dest,?List<T>?src)//通配符是?不確定的,所以這個方法不能保證兩個?List?具有相同的元素類型 public?void test(List<??extends?Number>?dest,?List<??extends?Number>?src)

像下面的代碼中,約定的 T 是 Number 的子類才可以,但是申明時是用的 String ,所以就會飄紅報錯。

圖片

不能保證兩個 List 具有相同的元素類型的情況

GlmapperGeneric<String>?glmapperGeneric?=?new?GlmapperGeneric<>(); List<String>?dest?=?new?ArrayList<>(); List<Number>?src?=?new?ArrayList<>(); glmapperGeneric.testNon(dest,src);

上面的代碼在編譯器并不會報錯,但是當進入到 testNon 方法內部操作時(比如賦值),對于 dest 和 src 而言,就還是需要進行類型轉換。

區(qū)別2:類型參數(shù)可以多重限定而通配符不行

圖片

使用 & 符號設定多重邊界(Multi Bounds),指定泛型類型 T 必須是 MultiLimitInterfaceA 和 MultiLimitInterfaceB 的共有子類型,此時變量 t 就具有了所有限定的方法和屬性。對于通配符來說,因為它不是一個確定的類型,所以不能進行多重限定。

區(qū)別3:通配符可以使用超類限定而類型參數(shù)不行

類型參數(shù) T 只具有 一種 類型限定方式:

T?extends?A

但是通配符 ? 可以進行 兩種限定:

??extends?A ??super?A

Class和 Class區(qū)別

前面介紹了 ?和 T 的區(qū)別,那么對于,Class<T>和 <Class<?>又有什么區(qū)別呢?Class<T>和 Class<?>

最常見的是在反射場景下的使用,這里以用一段發(fā)射的代碼來說明下。

//?通過反射的方式生成??multiLimit //?對象,這里比較明顯的是,我們需要使用強制類型轉換 MultiLimit?multiLimit?=?(MultiLimit) Class.forName("com.glmapper.bridge.boot.generic.MultiLimit").newInstance();

對于上述代碼,在運行期,如果反射的類型不是 MultiLimit 類,那么一定會報 java.lang.ClassCastException 錯誤。

對于這種情況,則可以使用下面的代碼來代替,使得在在編譯期就能直接 檢查到類型的問題:

圖片

Class<T>在實例化的時候,T 要替換成具體類。Class<?>它是個通配泛型,? 可以代表任何類型,所以主要用于聲明時的限制情況。比如,我們可以這樣做申明:

//?可以 public?Class<?>?clazz; //?不可以,因為?T?需要指定類型 public?Class<T>?clazzT;

所以當不知道定聲明什么類型的 Class 的時候可以定義一 個Class<?>。

圖片

那如果也想 public Class<T> clazzT;這樣的話,就必須讓當前的類也指定 T ,

public?class?Test3<T>?{public?Class<?>?clazz;//?不會報錯public?Class<T>?clazzT;

小結

本文零碎整理了下 JAVA 泛型中的一些點,不是很全,僅供參考。如果文中有不當?shù)牡胤?#xff0c;歡迎指正。

(完) 碼農突圍資料鏈接1、臥槽!字節(jié)跳動《算法中文手冊》火了,完整版 PDF 開放下載! 2、計算機基礎知識總結與操作系統(tǒng) PDF 下載 3、艾瑪,終于來了!《LeetCode Java版題解》.PDF 4、Github 10K+,《LeetCode刷題C/C++版答案》出爐.PDF歡迎添加魚哥個人微信:smartfish2020,進粉絲群或圍觀朋友圈

總結

以上是生活随笔為你收集整理的泛型中的 T、E、K、V,还记得嘛?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 夜夜小视频 | 久久青草免费视频 | 波多野结衣视频播放 | 中文字幕一级 | 国产精品国产精品国产专区蜜臀ah | 在线成人毛片 | 美女18网站 | 少妇精品| 日韩精品免费一区二区三区竹菊 | 91人人爱 | 人与嘼交av免费 | 国产精品亚洲成在人线 | 亚洲91在线 | 伦理自拍| 亚洲精品第一 | 天堂综合网 | 北岛玲在线 | 亚洲最新中文字幕 | 337p粉嫩日本欧洲亚洲大胆 | h视频在线观看网站 | 免费看欧美片 | 免费黄网站在线观看 | 91av国产精品| 亚洲少妇一区 | 国产日韩欧美综合在线 | 欧美日韩中文字幕 | 涩涩涩涩av | 欧美视频在线免费看 | 国产伦精品一区二区. | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 午夜极品| 日韩视频一区二区在线观看 | 性午夜 | 淫五月 | 天天射天天干天天 | 中文字幕Av日韩精品 | 在线观看免费成人 | 美女视频黄色在线观看 | 日本天堂网在线 | 美丽姑娘免费观看在线观看 | 福利视频免费看 | 国产精品无码av在线有声小说 | 少妇视频在线播放 | 欧美日韩人妻一区二区 | 欧美性猛交99久久久久99按摩 | 欧美极品视频在线观看 | 国产白浆一区二区 | 在线看黄网 | 亚洲激情一区二区 | www.四虎com| 欧美超碰在线观看 | 亚洲国产精品尤物yw在线观看 | 国产成人精品综合在线观看 | 欧美精品一区二区免费看 | 狠狠艹视频| 最近中文字幕第一页 | 亚洲免费激情视频 | 2018天天操| 国产成人综合在线观看 | 熟妇一区二区三区 | 男人猛进女人爽的大叫 | 久久久久成人网站 | 欧美性猛交69 | 日日噜噜噜夜夜爽爽狠狠 | 亚洲福利视频一区二区三区 | 超碰成人在线观看 | 精品人妻一区二区三区四区不卡 | 国产av无码专区亚洲av麻豆 | 日本黄色xxx | 国产一区欧美 | 欧美久久久久久久久久久久久久 | 日日爱av| 免费在线观看不卡av | 超碰在线c | 夜夜夜夜夜操 | 女人一级一片30分 | 亚州欧美日韩 | 日本亲与子乱xxx | 免费的毛片 | 欧美一区二区三区久久 | 中文字幕久久一区 | 天天操天天操天天操天天操 | 亚洲成人av电影 | 91精品国产一区二区在线观看 | 激情宗合网 | 我和单位漂亮少妇激情 | 熟妇人妻av无码一区二区三区 | 免费簧片在线观看 | ww久久| 黄色资源在线观看 | 妞干网精品 | 欧美a级黄色 | 糖心av | 亚洲第一狼人区 | 婷婷天堂网 | 免费国产a | 伊人成人动漫 | 国产高清片 | 美女扒开大腿让男人桶 |