Kotlin 泛型

预计阅读时间1 分 123 views

在软件开发中,我们常常需要编写能够处理多种数据类型的代码。Kotlin 中的泛型(Generics)提供了一种方法,使我们可以编写类型安全且可重用的代码。泛型的本质是参数化类型,即允许类型作为参数传递给类、接口和方法。这样一来,我们就能在保持类型安全的同时,避免编写重复代码。

泛型的定义和使用

定义泛型

在 Kotlin 中,泛型通过尖括号 <> 来定义。我们可以在类、接口和函数中使用泛型。以下是泛型的基本定义:

class Box<T>(t: T) {
    var value = t
}

在上面的例子中,T 是一个类型参数,表示 Box 类可以接受任何类型的参数。

使用泛型

定义了泛型之后,我们可以在实例化类时指定具体的类型:

val intBox = Box(1) // T 是 Int
val stringBox = Box("Hello") // T 是 String

类型参数约束

有时候,我们希望类型参数满足某些条件,例如必须是某个类的子类或实现某个接口。这种情况下,我们可以使用类型参数约束:

fun <T : Comparable<T>> sort(list: List<T>) {
    // 排序逻辑
}

在这个例子中,T 被约束为 Comparable 的子类型,因此我们可以对 T 类型的列表进行排序。

泛型函数

泛型不仅可以应用于类,还可以应用于函数。泛型函数的定义方式如下:

fun <T> singletonList(item: T): List<T> {
    return listOf(item)
}

在这里,<T> 声明了一个泛型参数,singletonList 函数返回一个包含单个元素的列表,元素类型与传入的参数相同。

泛型类

除了泛型函数,Kotlin 中还可以定义泛型类。泛型类允许我们在类的定义中使用类型参数,从而使类更加通用和灵活:

class Container<T>(private val item: T) {
    fun getItem(): T {
        return item
    }
}

在这个例子中,Container 类持有一个类型为 Titem,并提供了一个获取该 item 的方法。

示例代码

// 定义一个泛型类 Box
class Box<T>(t: T) {
    var value = t
}

// 定义一个泛型函数
fun <T> singletonList(item: T): List<T> {
    return listOf(item)
}

// 使用类型参数约束定义一个排序函数
fun <T : Comparable<T>> sort(list: List<T>): List<T> {
    return list.sorted()
}

// 定义一个泛型类 Container
class Container<T>(private val item: T) {
    fun getItem(): T {
        return item
    }
}

fun main() {
    // 使用泛型类 Box
    val intBox = Box(1)
    val stringBox = Box("Hello")

    println("Int Box: ${intBox.value}")
    println("String Box: ${stringBox.value}")

    // 使用泛型函数 singletonList
    val list = singletonList(42)
    println("Singleton List: $list")

    // 使用泛型函数 sort
    val sortedList = sort(listOf(3, 1, 4, 1, 5, 9))
    println("Sorted List: $sortedList")

    // 使用泛型类 Container
    val container = Container("Kotlin")
    println("Container Item: ${container.getItem()}")
}
分享此文档

Kotlin 泛型

或复制链接

本页目录