亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Kotlin泛型的使用介紹

 更新時(shí)間:2022年09月05日 15:20:51   作者:niuyongzhi  
泛型,即?"參數(shù)化類型",將類型參數(shù)化,可以用在類,接口,方法上。與?Java?一樣,Kotlin?也提供泛型,為類型安全提供保證,消除類型強(qiáng)轉(zhuǎn)的煩惱

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)文章

最新評(píng)論