第二部分:面向对象编程与 Kotlin 特性
第 8 章:泛型
8.1 泛型函数与泛型类
泛型的概念
泛型(Generics)是 Kotlin 中一种强大的特性,允许在定义类、接口或函数时使用类型参数,从而提高代码的复用性和类型安全性。通过泛型,可以编写出更加灵活且类型安全的代码。
泛型类
泛型类是指类或接口中使用了类型参数的类。定义泛型类时,需要在类名后添加尖括号 <T>,其中 T 是类型参数的占位符。
class Box<T>(t: T) {
var value = t
}
fun main() {
val intBox = Box<Int>(10) // 明确指定类型为 Int
val stringBox = Box("Hello") // 类型推断为 String
println(intBox.value) // 输出: 10
println(stringBox.value) // 输出: Hello
}
在上面的例子中,Box 是一个泛型类,可以存储任意类型的值。创建实例时,可以显式指定类型参数,也可以让编译器通过传入的参数自动推断类型。
泛型函数
泛型函数是指函数中使用类型参数的函数。定义泛型函数时,需要在函数名之前添加 <T>。
fun <T> singletonList(item: T): List<T> {
return listOf(item)
}
fun main() {
val list1 = singletonList<Int>(42) // 显式指定类型
val list2 = singletonList("Kotlin") // 类型推断为 String
println(list1) // 输出: [42]
println(list2) // 输出: [Kotlin]
}
泛型约束
有时需要对泛型的类型参数进行限制,确保它满足某些条件。可以通过 where 子句或直接指定上界来实现。
fun <T : Comparable<T>> maxOf(a: T, b: T): T {
return if (a > b) a else b
}
fun main() {
println(maxOf(10, 20)) // 输出: 20
println(maxOf("A", "B")) // 输出: B
}
在上面的例子中,T 必须是实现了 Comparable<T> 接口的类型,因此可以调用 > 操作符进行比较。
泛型的优势
- 类型安全:编译器会在编译时检查类型,避免运行时类型转换错误。
- 代码复用:可以编写通用的逻辑,适用于多种类型。
- 减少强制类型转换:泛型可以减少显式的类型转换代码。
总结
泛型是 Kotlin 中非常重要的特性,能够显著提升代码的灵活性和安全性。通过泛型类和泛型函数,可以编写出更加通用且类型安全的代码。在后续章节中,我们将进一步探讨泛型的其他高级特性,如类型擦除、协变和逆变等。
