關於 Kotlin 泛型的一切

Kailash Vaviya 2024年2月15日
  1. Kotlin 泛型
  2. 不使用 Kotlin 泛型的問題
  3. Kotlin 泛型如何解決問題
  4. 在 Kotlin 中傳遞一種泛型方法
關於 Kotlin 泛型的一切

本文介紹了 Kotlin 泛型的概念。Kotlin 泛型是強大的功能,允許定義可通過各種資料型別訪問的類和函式。

Kotlin 泛型

我們需要將泛型宣告為引數化型別。這些引數化型別是泛型型別的例項,並使用尖括號 <> 宣告。

在編譯時檢查泛型類和方法的型別差異。

這是語法:

通用類:

class_or_interface<Type>

通用方法:

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

我們知道 Kotlin 泛型是強大的特性,但是是什麼讓它們變得如此強大呢?這是他們提供的優勢。

Kotlin 泛型的優勢

Kotlin 泛型提供以下主要優勢。

  1. 型別安全——泛型只允許持有一種型別的物件,消除了型別錯誤的機會。
  2. 不需要型別轉換 - 泛型減少了對物件進行型別轉換的需要。
  3. 編譯時檢查——在編譯時進行檢查以避免執行時錯誤。

不使用 Kotlin 泛型的問題

問題在於,如果不使用 Kotlin 泛型,我們無法為引數傳遞不同的資料型別。讓我們考慮一個例子來看看這一點。

我們將建立一個帶有單個引數的 Student 類。然後我們將傳遞兩種資料型別:IntString,以檢視在編譯時會發生什麼。

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
}

輸出:

在不使用 Kotlin 泛型的情況下傳遞不同的資料型別

正如我們在輸出中看到的,程式丟擲了編譯時錯誤。程式碼在初始化時接受 Int 型別,但拒絕 String 型別"19"

Kotlin 泛型如何解決問題

為了克服多種資料型別的問題,我們可以使用泛型類。我們可以克服這個問題,因為泛型類接受單個引數的多種資料型別。

在這裡,我們將建立一個通用類,它將接受 IntString 型別。

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 中傳遞一種泛型方法

我們已經瞭解瞭如何在初始化期間使用 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)
    }
}

輸出:

將 Kotlin 泛型方法作為引數傳遞

作者: Kailash Vaviya
Kailash Vaviya avatar Kailash Vaviya avatar

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