LESSON 11

泛型入门

让一份代码装得下不同类型

概念 · 示例 · 练习 · 小测
预计 9 分钟可在 Playground 练习

先用人话理解

泛型用类型参数表示“这里的类型稍后再决定”。这样可以复用代码,同时保留编译器的类型检查,少写危险的强制转换。

本课要点:T 是类型参数的常见命名。out 常用于“只生产/提供 T”,in 常用于“消费/接收 T”。先理解方向即可。

代码例子

先读注释,再关注每一行如何把数据变成结果。

KOTLIN · 可独立运行
fun <T> firstOrNull(items: List<T>): T? = items.firstOrNull() // 空列表返回 null

class Box<T>(val value: T) { // 创建时决定盒子装什么类型
    fun open(): T = value
}

fun main() {
    println(firstOrNull(listOf("茶", "咖啡"))) // 茶
    println(firstOrNull(listOf(3, 5, 8)))      // 3
    println(firstOrNull(emptyList<String>())) // null

    val snackBox = Box("饼干")
    val numberBox = Box(42)
    println(snackBox.open())
    println(numberBox.open())
}

再看一个用法

KOTLIN · 可独立运行
class Box<T>(val value: T)

fun main() {
    val textBox = Box("可以放文字")
    val numberBox = Box(2026)
    println(textBox.value)
    println(numberBox.value)
}

动手改一改

class Box<T>(val value: T) val box = Box("把我换成数字或其他文字") println(box.value) // 尝试更换 Box 里的类型

去 Kotlin Playground 动手 ↗

提示:Android 专属示例需要 Android Studio 项目和对应依赖;普通 Kotlin 示例可在 Playground 中尝试。

三道小测

先自己选择,再展开答案。答错也没关系,重要的是知道为什么。

1. 泛型最主要的好处是什么?

查看答案与解析

正确答案:A。回到概念和代码示例,再解释一次为什么。

2. Box<T> 中的 T 是什么?

查看答案与解析

正确答案:B。抓住题目中的核心概念,重新对照示例理解。

3. out T 常见表达哪种方向?

查看答案与解析

正确答案:A。回到概念和代码示例,再解释一次为什么。

深入阅读

想继续往下挖,可以阅读 Kotlin / Android 官方文档。

打开官方文档 ↗

标记学习进度

进度保存在当前浏览器的 localStorage 中。