📜  Kotlin 泛型(1)

📅  最后修改于: 2023-12-03 15:17:10.066000             🧑  作者: Mango

Kotlin 泛型

在 Kotlin 中,泛型允许我们编写更加通用的代码,以便在不同的情况下重复使用。泛型可用于函数、类和接口中。

基本语法

要定义一个泛型函数或类,请在函数名(或类名)的后面添加尖括号,并用一个大写字母表示泛型参数的名称:

fun <T> genericFunction(arg1: T): T {
    return arg1
}

class MyGenericClass<T>(arg1: T) {
    val value: T = arg1
}

在这个例子中,T 表示泛型参数的名称。泛型函数 genericFunction 接受一个类型是 T 的参数 arg1,并返回一个相同类型的参数。

泛型类 MyGenericClass 接受一个类型是 T 的构造函数参数 arg1,并定义了一个 value 属性来存储该参数。

使用泛型

若要使用泛型代码,则需要为其指定正确的类型参数:

val intValue = genericFunction<Int>(42)
val stringValue = genericFunction<String>("Hello, World!")
val myIntClass = MyGenericClass<Int>(1)
val myStringClass = MyGenericClass<String>("Hello")

在这个例子中,我们调用了泛型函数 genericFunction,并为 T 指定了 Int 和 String 类型的参数。我们还实例化了 MyGenericClass 类,并为其 T 参数指定了 Int 和 String 类型。

类型上限和下限

在 Kotlin 中,可以为泛型参数指定上限和下限。上限和下限可以帮助我们限制泛型参数的类型。

上限

对于类型 T 的上限,我们可以使用 out 关键字,将泛型参数类型限制为指定类型和该类型的子类型:

interface List<out T> {
    fun get(index: Int): T
}

在这个例子中,List 接口的泛型参数类型被限制为 T 类型及其子类型。这意味着我们可以将 List 转换为 List

下限

对于类型 T 的下限,我们可以使用 in 关键字,将泛型参数类型限制为指定类型及其超类型:

interface Comparable<in T> {
    operator fun compareTo(other: T): Int
}

在这个例子中,Comparable 接口的泛型参数类型被限制为 T 类型及其超类型。这意味着我们可以将 Comparable 约束为 Comparable

消费者和生产者

在泛型中,我们通常将函数或类定义为“消费者”或“生产者”。

  • 消费者:使用泛型类型作为参数并返回结果,例如,Comparable
  • 生产者:不使用泛型类型作为参数,但以泛型类型作为返回类型。例如,MutableList

在 Kotlin 中,我们可以使用 out 和 in 关键字来标记泛型类型的“生产者”和“消费者”。out 关键字标记类型为“生产者”,而 in 关键字标记类型为“消费者”。

总结

Kotlin 的泛型功能让我们可以编写更加通用的代码,以便在不同的情况下重复使用。泛型可用于函数、类和接口中。我们可以为泛型参数指定上限和下限,以便限制泛型参数的类型。我们可以将泛型类型标记为“生产者”或“消费者”,并使用 out 和 in 关键字。