Kotlin-泛型和委托

泛型

泛型的使用是為了程序有更好的擴(kuò)展性。
泛型類和泛型方法

class MyClass<T> {
    fun <T>method(param:T):T{
        return param
    }
}

泛型的高級特性
java的泛型是通過類型擦除機(jī)制來實現(xiàn)的,什么事類型擦除機(jī)制,就是說泛型對于類型的約束只在編譯時期存在,運行時,JVM是識別不了我們在代碼中指定的泛型類型的。

泛型實化
Kotlin也是基于JVM上的語言,所以同樣存在類型擦除機(jī)制。但是Kotlin中有一個內(nèi)聯(lián)函數(shù),這個是用代碼替換的方式的原理實現(xiàn)的,所以避免了類型擦除機(jī)制,從而可以通過T::class.java來知道泛型是具體什么類型的。這里有個泛型實化必須添加的關(guān)鍵字reified

inline fun <reified T> getGenericType()=T::class.java

fun main(){
    val result1= getGenericType<String>()
    val result2= getGenericType<Int>()
    println(result1)
    println(result2)
}

泛型實化的應(yīng)用

 inline fun <reified T>startActivity(context: Context){
        val intent=Intent(context,T::class.java)
        context.startActivity(intent)
    }
    inline fun <reified T>startActivity(context: Context,block:Intent.()->Unit){
        val intent=Intent(context,T::class.java)
        intent.block()
        context.startActivity(intent)
    }

       startActivity<TestActivity>(this)
        startActivity<TestActivity>(this){
            putExtra("param1","1")
            putExtra("param2","2")
        }

泛型的協(xié)變
官方一點的描述,A是B的子類型,MyClass<A>又是MyClass<B>的子類型。那么我們就可以稱MyClass在T這個泛型上是協(xié)變的。
通俗的話來說MyClass中的數(shù)據(jù)是只讀就可以避免類型轉(zhuǎn)換異常,比如下面這個方法,只有g(shù)et方法,并且只能通過構(gòu)造函數(shù)來設(shè)置初始化值。注意關(guān)鍵字out

class SimpleData<out T>(val data:T){
    fun get():T{
        return data
    }
}

協(xié)變在kotlin中的應(yīng)用就是List

泛型的逆變
官方描述:A是B的子類型,MyClass<B>又是MyClass<A>的子類型,那么我們稱MyClass在T這個泛型上是逆變的
用通俗的話來說A里面的屬性就是B里面的屬性,規(guī)定了不會類型轉(zhuǎn)換異常,注意關(guān)鍵字in這個和協(xié)變是相反的。

interface Transformer<in T>{
    fun transform(t:T):String
}
委托

類委托
簡單來說就是自己寫的類,里面的一些方法在別的類已經(jīng)有現(xiàn)成的寫好了,直接用他的方法就可以了。和繼承還有點點區(qū)別,委托只是取自己想要的方法就可以了。

class Myset<T>(val hashSet: HashSet<T>):Set<T>{
    override val size: Int
        get() = hashSet.size

    override fun contains(element: T): Boolean {
        return hashSet.contains(element)
    }

    override fun containsAll(elements: Collection<T>): Boolean {
        return hashSet.containsAll(elements)
    }

    override fun isEmpty(): Boolean {
        return hashSet.isEmpty()
    }

    override fun iterator(): Iterator<T> {
        return hashSet.iterator()
    }
}

這就是把MySet的實現(xiàn)方法交給了HashSet的對象來實現(xiàn)了,自己沒有具體的實現(xiàn)方法,這個就是委托。
優(yōu)化,每次都要寫這種格式化的轉(zhuǎn)接方法比較麻煩,kotlin提供了by關(guān)鍵字。具體實現(xiàn)如下,這就代表了上面這段代碼。

class MySet2<T>(val hashSet: HashSet<T>):Set<T>by hashSet

屬性委托
lazy函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容