0Pricing
Kotlin Academy · 课时

泛型函数与泛型类

参数化类型

泛型函数与泛型类 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。

什么是泛型

泛型让您能够编写适用于多种类型的代码,同时保持完整的类型安全。您不必固定使用某个具体类型,而是使用类型参数(通常为 T)作为占位符。

泛型函数

泛型函数会在函数名称前的尖括号中声明类型参数。在这里,T 可以是任意类型。

fun <T> identity(value: T): T {
    return value
}

fun main() {
    println(identity(42))
    println(identity("hello"))
}

类型推断

您很少需要显式指定类型;编译器会根据参数推断 T。如果需要,您仍然可以写成 identity<Int>(42)。

fun <T> firstOf(a: T, b: T): T = a

fun main() {
    val x = firstOf(10, 20)
    val y = firstOf("a", "b")
    println("$x $y")
}

多个类型参数

一个函数可以拥有多个类型参数,这对于处理两个互不相关的类型组成的配对数据很有用。

fun <A, B> makePair(first: A, second: B): Pair<A, B> {
    return Pair(first, second)
}

fun main() {
    val p = makePair("age", 30)
    println(p)
}

泛型类

类同样可以是泛型的。类型参数声明在类名之后,并且可以用于属性和函数。

class Box<T>(val value: T) {
    fun get(): T = value
}

fun main() {
    val intBox = Box(123)
    val strBox = Box("Kotlin")
    println(intBox.get())
    println(strBox.get())
}

带行为的泛型类

泛型类可以保存可变状态,并对类型参数执行操作,例如充当一个简单的容器。

class Stack<T> {
    private val items = mutableListOf<T>()
    fun push(item: T) { items.add(item) }
    fun pop(): T = items.removeAt(items.size - 1)
    fun isEmpty() = items.isEmpty()
}

fun main() {
    val stack = Stack<Int>()
    stack.push(1)
    stack.push(2)
    println(stack.pop())
}

泛型接口

接口也可以声明类型参数,从而让实现类选择具体类型。

interface Container<T> {
    fun item(): T
}

class StringContainer : Container<String> {
    override fun item(): String = "fixed"
}

fun main() {
    println(StringContainer().item())
}

为什么不直接使用 Any

您可以将值存储为 Any,但这样会丢失类型信息,并且需要进行类型转换。泛型会保留确切的类型,让编译器捕获错误,因此无需进行类型转换。

fun main() {
    val box: Box<String> = Box("text")
    val s: String = box.get()
    println(s.uppercase())
}

class Box<T>(val value: T) { fun get(): T = value }

泛型扩展函数

扩展函数可以是泛型的,从而为所有类型提供可复用的工具函数。

fun <T> T.printAndReturn(): T {
    println("Value: $this")
    return this
}

fun main() {
    val x = 5.printAndReturn()
    "hi".printAndReturn()
    println(x)
}

命名约定

按照约定,类型参数使用单个大写字母命名:泛型类型使用 T,元素使用 E,映射的键和值使用 K 和 V,结果使用 R。

泛型无处不在

Kotlin 的标准库建立在泛型之上:List<T>、Map<K, V> 和 Pair<A, B>。理解泛型有助于您更有把握地阅读和使用这些类型。

快速检查

与使用 Any 相比,泛型的主要优势是什么?

回顾

泛型使用 T 之类的类型参数来编写可复用且类型安全的函数、类和接口。编译器会推断类型并强制执行安全性,从而避免类型转换。接下来,您将通过使用 in 和 out 在声明处指定型变,来控制泛型类型之间的关系。

常见问题解答

「泛型函数与泛型类」课时是免费的吗?

是的 — 「泛型函数与泛型类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。

「泛型函数与泛型类」这节课中我会学到什么?

参数化类型 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Kotlin Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「泛型函数与泛型类」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Kotlin Academy 课中编写并运行代码吗?

能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 泛型函数与泛型类
  2. 声明处型变
  3. 使用处型变
  4. 泛型约束
← 返回 Kotlin Academy