最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Kotlin的泛型系統(tǒng)

 更新時(shí)間:2017年12月13日 09:07:24   投稿:daisy  
Kotlin 泛型即 “參數(shù)化類型”,將類型參數(shù)化,可以用在類,接口,方法上。下面 這篇文章主要給大家介紹了關(guān)于Kotlin泛型系統(tǒng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。

前言

Kotlin 的泛型與 Java 一樣,都是一種語法糖,只在源代碼里出現(xiàn),編譯時(shí)會(huì)進(jìn)行簡單的字符串替換。

泛型是靜態(tài)類型語言中不可缺少的一部分,Kotlin 的泛型定義和使用都類似 Java,但也有一些基于工程實(shí)踐考慮的優(yōu)化和改進(jìn)。

泛型(Generics)其實(shí)就是把類型參數(shù)化,真正的名字叫做 類型參數(shù),它給強(qiáng)類型編程語言加入了更強(qiáng)的靈活性。在 Java 中,只要是有類型的 API 元素,都可以泛型化,也就是泛型類、泛型接口、泛型方法和泛型屬性,泛型類和泛型接口可以統(tǒng)稱為泛型類型。其中最重要的是泛型類型和泛型方法,Kotlin 泛型系統(tǒng)繼承了 Java 泛型系統(tǒng),同時(shí)添加了一些強(qiáng)化的地方。

實(shí)化泛型參數(shù)

在 Java 中經(jīng)常會(huì)定義這種方法:

<T> void someFunction(Class<T> clazz) {
 //...
}

這是因?yàn)?Java 的泛型擦除機(jī)制無法使用形如 T.class 來獲取泛型的真實(shí)類型對象。但是在調(diào)用者看來,泛型卻是實(shí)實(shí)在在的固定類型,所以這里借助 Kotlin 的內(nèi)聯(lián)函數(shù) inline 可以實(shí)化泛型參數(shù),在 Kotlin 中只需要這樣:

fun <T> someFunction() {
 val clazz = T::class.java 
}

泛型的協(xié)變、逆變

在 Java 中,定義帶泛型的參數(shù)時(shí)為了更好的匹配目標(biāo)類型,有 ? extends Type 和 ? super Type 兩種形式,以 List 接口中的定義為例:

boolean addAll(Collection<? extends E> c);
void sort(Comparator<? super E> c);

addAll 方法中,Collection 中的泛型被定義成接收類型參數(shù) E 的子類,這是因?yàn)樾枰x取也就 c 的值,所以需要保證 c 是 Collection 的子類;而 sort 方法中,則是需要類中的類型參數(shù) E 能夠被 Comparator 中的方法傳入,所以也就需要保證 E 是 Comparator 類型參數(shù)的子類。

而 Kotlin 中,針對于這兩種情況給了另外兩個(gè)關(guān)鍵字:需要讀取帶泛型對象的值時(shí),使用 out 來標(biāo)記類型參數(shù);需要傳入類型參數(shù)的類型作為形參時(shí),使用 in。

這兩種關(guān)鍵字的命名的方向是不同的:Java 偏向于從原理的方向命名,而 Kotlin 的命名對于具體的使用場景更為直觀。在 Kotlin 中,被 out 標(biāo)記類型參數(shù)的類型稱之為協(xié)變類型,它代表當(dāng) A 是 B 的子類時(shí),C 也能作為 C 的子類使用;而被 in 標(biāo)記類型參數(shù)的類型則相反,它代表當(dāng) A 是 B的子類時(shí),C 是 C 的子類。

從方法參數(shù)的使用上來說,Kotlin 和 Java 似乎沒有什么不同,而不同的地方在于 Kotlin 可以將這種定義作用在類型定義上,官方稱之為聲明點(diǎn)變型;與之相對應(yīng)的,像 Java 這種在方法參數(shù)上定義的被稱為使用點(diǎn)變型。

聲明點(diǎn)變型在類型的聲明時(shí)定義了該類型參數(shù)是用在入?yún)⑦€是出參上,之后在這個(gè)類中所有用到的地方都會(huì)直接調(diào)用該類型的定義名稱來使用該類型的協(xié)變或者逆變。而 Java 中需要在每次使用時(shí)來重復(fù)說明該處需要協(xié)變還是逆變。Kotlin 也可以進(jìn)行使用點(diǎn)變型,只要和 Java 一樣,在聲明處不進(jìn)行說明,而只在使用時(shí)聲明就可以了。

「*」投影

因?yàn)?Kotlin 源碼中不允許忽略泛型參數(shù),所以在一些泛型不重要的地方,就不可避免的使用 來表示。當(dāng)使用 時(shí),為了保證類型安全,官方建議的模式是將泛型定義為 的對象封裝起來,寫操作一般是安全的,因?yàn)?可以接收一切類型;對于讀操作可以進(jìn)行安全的轉(zhuǎn)換,對于不匹配的類型進(jìn)行統(tǒng)一處理。

泛型的注意點(diǎn):

在java編程中類型系統(tǒng)最棘手的一部分是通配符類型。但是,在Kotlin編程中,是沒有通配符,采用聲明變化和類型投影來替代。

通配符的作用: 使用界限通配符增加API的靈活性。

在Java編程中一個(gè)常見的問題:

List<String> strs = new ArrayList<String>();
List<Object> objs = strs; // !!! 這里會(huì)導(dǎo)致一個(gè)問題,在Java中是禁止這樣做的
objs.add(1); //將integer類型的數(shù)據(jù)添加到String 類型的列表中
String s = strs.get(0); // !!! ClassCastException異常 : Integer類型不能轉(zhuǎn)成String

在Kotlin編程中:

一旦聲明類型后,不能加入其它的類型數(shù)據(jù),如下圖所示。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

旬阳县| 双流县| 赣州市| 洪泽县| 霸州市| 嘉兴市| 新丰县| 视频| 铅山县| 平定县| 西丰县| 甘德县| 阿坝| 明光市| 唐海县| 古交市| 鄂伦春自治旗| 甘洛县| 白朗县| 商城县| 耒阳市| 偏关县| 达日县| 临夏市| 昌宁县| 嘉黎县| 文成县| 扎鲁特旗| 怀仁县| 景谷| 田东县| 平定县| 景洪市| 龙口市| 峨山| 平度市| 开平市| 金塔县| 斗六市| 淄博市| 高密市|