Kotlin泛型的使用介紹
1.泛型類、泛型函數(shù)
1)泛型類可以接收任意類型。Package<T>(t: T)
2)泛型類中定義的泛型參數(shù)<T>,通常用T(Type)表示,(t: T) 這個(gè)表示泛型類Package的主構(gòu)造函數(shù)可以接收T類型的屬性。
3)openPackage(): T定義一個(gè)返回T類型的泛型函數(shù)。
4)fun <R> getProductName(block: (T) -> R): R getProductName的返回值是R(英文的Return),接收一個(gè)匿名函數(shù)為參數(shù)block: (T) -> R,這個(gè)匿名函數(shù)的參數(shù)是T,返回值是R。也就是說(shuō),匿名函數(shù)的返回值,就是getProductName的返回值。這個(gè)和前面講到的apply、let、run、with等是一樣的多參數(shù)函數(shù)。
//泛型類 class Package<T>(t: T) { private val product: T = t //泛型函數(shù) fun openPackage(): T { return product } //多參數(shù)泛型函數(shù) fun <R> getProductName(block: (T) -> R): R { return block(product) } }
fun main() { val pkg = Package(Phone("IPhone")) println(pkg.openPackage()) println(pkg.getProductName { it.name }) val pkg2 = Package(Fruit("Apple")) println(pkg2.openPackage()) println(pkg2.getProductName { it.name }) }
2.泛型類型約束。上面的泛型類,可以接收任意類型。如果我們只想某個(gè)類接收特定類型的,可以使用泛型約束。
1)定義一個(gè)父類Fruit和兩個(gè)子類,Apple和Banana
open class Fruit(val name:String){ } class Apple(name:String) : Fruit(name){ } class Banana(name:String):Fruit(name){ }
2)定義泛型類約束:<T:Fruit> 表示只能接收Fruit類或子類。和Java中的<? extends Fruit>作用是一樣的。
Kotlin中定義泛型約束
class Package<T:Fruit>(t: T) { private val product: T = t fun openPackage(): T { return product } fun <R> getProductName(block: (T) -> R): R { return block(product) } } fun main() { //定義了泛型約束的類,只能放Fruit的子類 val pkg = Package(Apple("apple")) val pkg2 = Package(Banana("banana")) //Phone類型是放不進(jìn)去的 val pkg3 = Package(Phone("Iphone")) }
Java中定義泛型約束
public class Package<T extends Fruit> { public T t; public Package(T t) { this.t = t; } public T openPackage() { return t; } }
3.泛型類接收的參數(shù)也可以是一個(gè)集合:
class Package<T:Fruit>(list:List<T>) { var list = list fun get(index:Int):Fruit = list[index] }
vararg items: T 就表示可以存放多個(gè)。vararg就是對(duì)應(yīng)java中的可變參數(shù)。可以用一個(gè)數(shù)組來(lái)接收它Array<out T> ,這里的out 就是協(xié)變的意思。表示,可以就收該類或該類的子類。
class Package<T : Fruit>(vararg items: T) { var itmes: Array<out T> = items operator fun get(index: Int): Fruit = itmes[index] }
fun main() { val p = Package22(listOf(Apple("apple"))) println(p.get(0)) val p2 = Package(Apple("apple")) println(p2[0]) }
4.協(xié)變out,逆變in
out T 對(duì)應(yīng)java中的 ?extend T
int T 對(duì)應(yīng)java中的?super T
5.類型擦除
對(duì)應(yīng)java和Kotlin,泛型都值存在于編譯期,運(yùn)行后,就不存在泛型的概念,而是指定類型。
如果我們想要檢查所傳入泛型的類型,在kotlin中可以使用reified 關(guān)鍵字。在Java中可以通過(guò)反射的方式,來(lái)獲取泛型的類型。
到此這篇關(guān)于Kotlin泛型的使用介紹的文章就介紹到這了,更多相關(guān)Kotlin泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
flutter InheritedWidget使用方法總結(jié)
這篇文章主要為大家介紹了flutter InheritedWidget使用方法總結(jié)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android之AppWidget(桌面小部件)開發(fā)淺析
這篇文章主要介紹了Android之AppWidget(桌面小部件)開發(fā)淺析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02Android多進(jìn)程間采用AIDL方式進(jìn)行通信
這篇文章主要為大家詳細(xì)介紹了Android多進(jìn)程間采用AIDL方式進(jìn)行通信,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04android屏幕圓角實(shí)現(xiàn)方法的示例代碼
本篇文章主要介紹了android屏幕圓角實(shí)現(xiàn)方法的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Android Handler中的休眠喚醒實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Android Handler中的休眠喚醒實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android基礎(chǔ)知識(shí)之frame動(dòng)畫效果
Android基礎(chǔ)知識(shí)之tween動(dòng)畫效果,Android一共提供了兩種動(dòng)畫,這篇文章主要介紹了Android動(dòng)畫效果之frame動(dòng)畫,感興趣的小伙伴們可以參考一下2016-06-06Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)網(wǎng)絡(luò)圖片瀏覽器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05