泛型函数与泛型类
参数化类型
泛型函数与泛型类 是 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 反馈 — 无需本地设置。