這篇文章給大家分享的是有關(guān)Kotlin中泛型系統(tǒng)的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
10年的布爾津網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整布爾津建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“布爾津網(wǎng)站設(shè)計(jì)”,“布爾津網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。Kotlin 的泛型與 Java 一樣,都是一種語(yǔ)法糖,只在源代碼里出現(xiàn),編譯時(shí)會(huì)進(jìn)行簡(jiǎn)單的字符串替換。
泛型是靜態(tài)類(lèi)型語(yǔ)言中不可缺少的一部分,Kotlin 的泛型定義和使用都類(lèi)似 Java,但也有一些基于工程實(shí)踐考慮的優(yōu)化和改進(jìn)。
泛型(Generics)其實(shí)就是把類(lèi)型參數(shù)化,真正的名字叫做 類(lèi)型參數(shù),它給強(qiáng)類(lèi)型編程語(yǔ)言加入了更強(qiáng)的靈活性。在 Java 中,只要是有類(lèi)型的 API 元素,都可以泛型化,也就是泛型類(lèi)、泛型接口、泛型方法和泛型屬性,泛型類(lèi)和泛型接口可以統(tǒng)稱為泛型類(lèi)型。其中最重要的是泛型類(lèi)型和泛型方法,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ī)制無(wú)法使用形如 T.class
來(lái)獲取泛型的真實(shí)類(lèi)型對(duì)象。但是在調(diào)用者看來(lái),泛型卻是實(shí)實(shí)在在的固定類(lèi)型,所以這里借助 Kotlin 的內(nèi)聯(lián)函數(shù) inline 可以實(shí)化泛型參數(shù),在 Kotlin 中只需要這樣:
fun <T> someFunction() { val clazz = T::class.java }
泛型的協(xié)變、逆變
在 Java 中,定義帶泛型的參數(shù)時(shí)為了更好的匹配目標(biāo)類(lèi)型,有 ? extends Type 和 ? super Type 兩種形式,以 List 接口中的定義為例:
boolean addAll(Collection<? extends E> c); void sort(Comparator<? super E> c);
addAll 方法中,Collection 中的泛型被定義成接收類(lèi)型參數(shù) E 的子類(lèi),這是因?yàn)樾枰x取也就 c 的值,所以需要保證 c 是 Collection 的子類(lèi);而 sort 方法中,則是需要類(lèi)中的類(lèi)型參數(shù) E 能夠被 Comparator 中的方法傳入,所以也就需要保證 E 是 Comparator 類(lèi)型參數(shù)的子類(lèi)。
而 Kotlin 中,針對(duì)于這兩種情況給了另外兩個(gè)關(guān)鍵字:需要讀取帶泛型對(duì)象的值時(shí),使用 out 來(lái)標(biāo)記類(lèi)型參數(shù);需要傳入類(lèi)型參數(shù)的類(lèi)型作為形參時(shí),使用 in。
這兩種關(guān)鍵字的命名的方向是不同的:Java 偏向于從原理的方向命名,而 Kotlin 的命名對(duì)于具體的使用場(chǎng)景更為直觀。在 Kotlin 中,被 out 標(biāo)記類(lèi)型參數(shù)的類(lèi)型稱之為協(xié)變類(lèi)型,它代表當(dāng) A 是 B 的子類(lèi)時(shí),C 也能作為 C 的子類(lèi)使用;而被 in 標(biāo)記類(lèi)型參數(shù)的類(lèi)型則相反,它代表當(dāng) A 是 B的子類(lèi)時(shí),C 是 C 的子類(lèi)。
從方法參數(shù)的使用上來(lái)說(shuō),Kotlin 和 Java 似乎沒(méi)有什么不同,而不同的地方在于 Kotlin 可以將這種定義作用在類(lèi)型定義上,官方稱之為聲明點(diǎn)變型;與之相對(duì)應(yīng)的,像 Java 這種在方法參數(shù)上定義的被稱為使用點(diǎn)變型。
聲明點(diǎn)變型在類(lèi)型的聲明時(shí)定義了該類(lèi)型參數(shù)是用在入?yún)⑦€是出參上,之后在這個(gè)類(lèi)中所有用到的地方都會(huì)直接調(diào)用該類(lèi)型的定義名稱來(lái)使用該類(lèi)型的協(xié)變或者逆變。而 Java 中需要在每次使用時(shí)來(lái)重復(fù)說(shuō)明該處需要協(xié)變還是逆變。Kotlin 也可以進(jìn)行使用點(diǎn)變型,只要和 Java 一樣,在聲明處不進(jìn)行說(shuō)明,而只在使用時(shí)聲明就可以了。
「*」投影
因?yàn)?Kotlin 源碼中不允許忽略泛型參數(shù),所以在一些泛型不重要的地方,就不可避免的使用 來(lái)表示。當(dāng)使用 時(shí),為了保證類(lèi)型安全,官方建議的模式是將泛型定義為 的對(duì)象封裝起來(lái),寫(xiě)操作一般是安全的,因?yàn)?可以接收一切類(lèi)型;對(duì)于讀操作可以進(jìn)行安全的轉(zhuǎn)換,對(duì)于不匹配的類(lèi)型進(jìn)行統(tǒng)一處理。
泛型的注意點(diǎn):
在java編程中類(lèi)型系統(tǒng)最棘手的一部分是通配符類(lèi)型。但是,在Kotlin編程中,是沒(méi)有通配符,采用聲明變化和類(lèi)型投影來(lái)替代。
通配符的作用: 使用界限通配符增加API的靈活性。
在Java編程中一個(gè)常見(jiàn)的問(wèn)題:
List<String> strs = new ArrayList<String>(); List<Object> objs = strs; // !!! 這里會(huì)導(dǎo)致一個(gè)問(wèn)題,在Java中是禁止這樣做的 objs.add(1); //將integer類(lèi)型的數(shù)據(jù)添加到String 類(lèi)型的列表中 String s = strs.get(0); // !!! ClassCastException異常 : Integer類(lèi)型不能轉(zhuǎn)成String
在Kotlin編程中:
一旦聲明類(lèi)型后,不能加入其它的類(lèi)型數(shù)據(jù),如下圖所示。
感謝各位的閱讀!關(guān)于“Kotlin中泛型系統(tǒng)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
本文名稱:Kotlin中泛型系統(tǒng)的示例分析-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://jinyejixie.com/article22/dsigjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站排名、用戶體驗(yàn)、網(wǎng)站制作、小程序開(kāi)發(fā)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容