Kotlin泛型

泛型是高級編程語言中強大的功能,允許定義使用不同類型訪問的類,方法和屬性等。 在編譯時檢查類,方法等的類型差異。

泛型類或類聲明爲參數化類型。 參數化類型是具有實際類型參數的泛型類型的實例。 參數化類型使用尖括號聲明<>泛型主要用於集合。

泛型的優點

以下是使用泛型的主要優點:

  • 類型安全:通用允許僅保留單一類型的對象。泛型不允許存儲其他對象。
  • 不需要類型轉換:不需要對對象進行類型轉換。
  • 編譯時間檢查:在編譯時檢查泛型代碼,以便在運行時避免任何問題。

下面來看看在不使用泛型的情況下的存在的一些問題。

在此示例中,使用具有單個參數的主構造函數創建Person類。 現在,要在Person類的對象中傳遞不同類型的數據(比如Int類型爲Person(30)String類型爲Person("40"))。 Person類的主要構造函數接受Int類型Person(30),但是又想接受String類型的Person("40")。它會在類型不匹配時生成編譯時錯誤。

class Person (age:Int){
    var age: Int = age
    init {
        this.age= age
        println(age)
    }
}
fun main(args: Array<String>){
    var ageInt: Person = Person(30)
    var ageString: Person = Person("30")// 編譯時出錯
}

爲了解決上述問題,使用泛型類,這是一個用戶定義的類,它接受單個類中不同類型的參數。

使用泛型類型重寫上面的代碼。 類型爲<T>Person是一個通用類型類,它接受IntString類型的參數。

換句話說,類型參數<T>是一個佔位符,它將用實際的類型參數替換。它將在實例化泛型類型時替換。

class Person<T>(age: T){
    var age: T = age
    init {
        this.age= age
        println(age)
    }
}
fun main(args: Array<String>){
    var ageInt: Person<Int> = Person<Int>(30)
    var ageString: Person<String> = Person<String>("40")
}

執行上面示例代碼,得到以下結果 -

30
40

在上面的示例中,當使用類型Int作爲Person <Int>(30)Person <String>("40")創建Person類的對象時,它將分別用IntString替換Person類的T類型。

泛型語法

class_or_interface<Type>

泛型方法的語法

<Type>methodName(parameter: classType<Type>)

Kotlin泛型示例

下面來看看一個泛型方法的示例。 在此示例中,訪問集合類型的泛型方法(ArrayList)。 分別爲StringFloat類型創建ArrayListarrayListOf <String>("Maxsu","Yiibai")arrayListOf <Float>(10.5f,5.0f,25.5f)的兩個不同類型對象。 當使用printValue(stringList)調用泛型方法<T> printValue(list:ArrayList <T>)時,方法<T> printValue(list:ArrayList <T>)的類型T將自動替換爲String類型。 類似地,當使用printValue(floatList)調用泛型方法時,方法<T> printValue(list:ArrayList <T>)的類型T將自動替換爲Float類型。

fun main(args: Array<String>){
    val stringList: ArrayList<String> = arrayListOf<String>("Maxsu","Yiibai")
    val s: String = stringList[0]
    println("打印 stringList 的字符串值: $s")
    printValue(stringList)
    val floatList: ArrayList<Float> = arrayListOf<Float>(10.5f,5.0f,25.5f)
    printValue(floatList)
}
fun <T>printValue(list: ArrayList<T>){
    for(element in list){
        println(element)
    }
}

執行上面示例代碼,得到以下結果 -

打印 stringList 的字符串值: Maxsu
Maxsu
Yiibai
10.5
5.0
25.5

Kotlin通用擴展函數示例

由於擴展函數允許向類添加方法,而不繼承類或任何設計模式。

在這個例子中,將一個方法printValue()添加到泛型類型的ArrayList類中。對就於StringFloat類型的方法分別爲stringList.printValue()floatList.printValue()。 擴展函數中的this關鍵字表示當前調用實例。 當使用stringList.printValue()調用擴展函數時,this表示包含String類型值的stringList實例。 類似地,使用floatList.printValue()調用擴展函數時,this表示包含Float類型值的floatList實例。

fun main(args: Array<String>){
    val stringList: ArrayList<String> = arrayListOf<String>("Maxsu","Yiibai")
    stringList.printValue()
    val floatList: ArrayList<Float> = arrayListOf<Float>(10.5f,5.0f,25.5f)
    floatList.printValue()
}
fun <T>ArrayList<T>.printValue(){
    for(element in this){
        println(element)
    }
}

執行上面示例代碼,得到以下結果 -

Maxsu
Yiibai
10.5
5.0
25.5