關於 Kotlin 泛型的一切
本文介紹了 Kotlin 泛型的概念。Kotlin 泛型是強大的功能,允許定義可通過各種資料型別訪問的類和函式。
Kotlin 泛型
我們需要將泛型宣告為引數化型別。這些引數化型別是泛型型別的例項,並使用尖括號 <>
宣告。
在編譯時檢查泛型類和方法的型別差異。
這是語法:
通用類:
class_or_interface<Type>
通用方法:
<Type>methodName(parameter: classType<Type>)
我們知道 Kotlin 泛型是強大的特性,但是是什麼讓它們變得如此強大呢?這是他們提供的優勢。
Kotlin 泛型的優勢
Kotlin 泛型提供以下主要優勢。
- 型別安全——泛型只允許持有一種型別的物件,消除了型別錯誤的機會。
- 不需要型別轉換 - 泛型減少了對物件進行型別轉換的需要。
- 編譯時檢查——在編譯時進行檢查以避免執行時錯誤。
不使用 Kotlin 泛型的問題
問題在於,如果不使用 Kotlin 泛型,我們無法為引數傳遞不同的資料型別。讓我們考慮一個例子來看看這一點。
我們將建立一個帶有單個引數的 Student
類。然後我們將傳遞兩種資料型別:Int
和 String
,以檢視在編譯時會發生什麼。
class Student (id:Int){
var id: Int = id
init {
this.id = id
println(id)
}
}
fun main(args: Array<String>){
var idInt: Student = Student(17)
var idString: Student = Student("19") // This throws an error
}
輸出:
正如我們在輸出中看到的,程式丟擲了編譯時錯誤。程式碼在初始化時接受 Int
型別,但拒絕 String
型別"19"
。
Kotlin 泛型如何解決問題
為了克服多種資料型別的問題,我們可以使用泛型類。我們可以克服這個問題,因為泛型類接受單個引數的多種資料型別。
在這裡,我們將建立一個通用類,它將接受 Int
和 String
型別。
class Student<T>(id: T){
var id: T = id
init {
this.id = id
println(id)
}
}
fun main(args: Array<String>){
var idInt: Student<Int> = Student(17)
var idString: Student<String> = Student("19") // This won't throw an error
}
輸出:
在上面的例子中,物件的資料型別根據我們傳遞的引數而改變。
在 Kotlin 中傳遞一種泛型方法
我們已經瞭解瞭如何在初始化期間使用 Kotlin 泛型來傳遞不同的資料型別。但是如果我們想傳遞一個泛型方法作為引數呢?
這是一個示例,我們建立了一個泛型方法並將其作為引數傳遞。
import kotlin.reflect.KClass
data class Person(val city: String)
data class Employee(val city: String)
fun getPerson(): List<Person> = listOf(Person("New York"))
fun getEmployee(): List<Employee> = listOf(Employee("Chicago"))
fun <T: Any> getInfo(xyz: KClass<T>): List<T>? {
return when(xyz) {
Person::class -> getPerson() as List<T>
Employee::class -> getEmployee() as List<T>
else -> null
}
}
fun main(args: Array<String>) {
val v = listOf(Person::class, Employee::class)
v.forEach { type ->
val i = getInfo(type)
println(i)
}
}
輸出:
Kailash Vaviya is a freelance writer who started writing in 2019 and has never stopped since then as he fell in love with it. He has a soft corner for technology and likes to read, learn, and write about it. His content is focused on providing information to help build a brand presence and gain engagement.
LinkedIn