Kotlin 泛型
Kotlin 中的泛型允许你编写更加通用和可重用的代码。通过使用泛型,你可以创建一个可以与任何类型一起使用的类、接口或函数,而无需在每个需要使用不同类型的情况下重新定义代码。
以下是 Kotlin 泛型的一些关键概念和用法:
泛型类和接口
你可以为类或接口定义一个或多个类型参数。类型参数用尖括号尖括号 (<T>
) 来表示:
class Box<T>(var content: T)
fun main() {
val intBox = Box(1)
val stringBox = Box("Hello")
println(intBox.content) // 输出: 1
println(stringBox.content) // 输出: Hello
}
泛型函数
函数也可以使用泛型参数,从而使其适用于多个类型:
fun <T> printItem(item: T) {
println(item)
}
fun main() {
printItem(123) // 输出: 123
printItem("Hello") // 输出: Hello
}
泛型约束
有时候,你可能需要约束泛型类型,以确保它具备某些特定的性质或提供特定的方法。Kotlin 支持通过 where
关键字指定泛型约束:
fun <T : Comparable<T>> sort(list: List<T>) {
// 在这里,"T" 可以是任何实现了 Comparable<T> 接口的类型
}
fun main() {
sort(listOf(3, 1, 2)) // 可以排序 Int 类型
}
型变(Variance)
Kotlin 中有型变修饰符 out
和 in
,用于指定泛型类型参数的型变行为,以在子类型化的复杂情况下提供更灵活的 API。
- 协变 (Covariance): 使用
out
关键字,意味着可以使用该泛型类型的子类型。当你只从类中获取内容,你可以使用协变。
interface Source<out T> {
fun nextT(): T
}
- 逆变 (Contravariance): 使用
in
关键字,意味着可以使用该泛型类型的超类型。当你只将信息传入类时,可以使用逆变。
interface Comparable<in T> {
fun compareTo(other: T): Int
}
类型投影(Type Projection)则提供了一种手动的替代型变的手段,允许你明确控制哪些函数参数是协变或逆变的。
通过使用 Kotlin 泛型,你可以编写更为灵活和通用的代码,同时还能保证类型安全性。