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
是一個通用類型類,它接受Int
和String
類型的參數。
換句話說,類型參數<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
類的對象時,它將分別用Int
和String
替換Person
類的T
類型。
泛型語法
class_or_interface<Type>
泛型方法的語法
<Type>methodName(parameter: classType<Type>)
Kotlin泛型示例
下面來看看一個泛型方法的示例。 在此示例中,訪問集合類型的泛型方法(ArrayList
)。 分別爲String
和Float
類型創建ArrayList
類arrayListOf <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
類中。對就於String
和Float
類型的方法分別爲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