泛型是编程语言中一个强大的特性,它允许你在编写代码时定义一些通用的类型,而不是特定的类型。通过使用泛型,你可以编写更加灵活和可重用的代码。Kotlin 作为一种现代编程语言,提供了丰富的泛型支持,使得开发者可以更容易地编写类型安全的代码。
Kotlin 中的泛型
在 Kotlin 中,泛型主要用于类、接口和函数。通过使用泛型,你可以使这些代码结构适用于多种类型,而无需为每种类型重复编写代码。
泛型类和泛型接口
定义泛型类和接口时,可以使用尖括号 <>
指定类型参数。例如:
class Box<T>(var value: T)
这里,Box
是一个泛型类,它包含一个类型参数 T
。你可以使用任意类型来实例化这个类:
val intBox = Box(1)
val stringBox = Box("Hello")
泛型函数
Kotlin 允许函数使用泛型类型参数。你可以在函数名称之前使用尖括号 <>
指定类型参数。例如:
fun <T> singletonList(item: T): List<T> {
return listOf(item)
}
val intList = singletonList(1)
val stringList = singletonList("Hello")
类型约束
有时你希望泛型类型参数满足某些条件(例如,必须实现某个接口或继承某个类)。你可以使用 where
关键字进行类型约束。例如:
fun <T : Comparable<T>> sort(list: List<T>) {
// 排序逻辑
}
sort(listOf(3, 1, 2)) // Works because Int is Comparable<Int>
协变与逆变
Kotlin 支持协变(covariance)和逆变(contravariance),使得你可以更灵活地处理泛型类型。协变使用 out
关键字,而逆变使用 in
关键字。
协变(out)
当一个泛型类只生产(输出)T类型的值时,你可以将它声明为协变的。例如:
interface Producer<out T> {
fun produce(): T
}
class StringProducer : Producer<String> {
override fun produce(): String = "Hello"
}
val producer: Producer<Any> = StringProducer() // 协变允许这样赋值
逆变(in)
当一个泛型类只消费(输入)T类型的值时,你可以将它声明为逆变的。例如:
interface Consumer<in T> {
fun consume(item: T)
}
class StringConsumer : Consumer<String> {
override fun consume(item: String) {
println("Consumed: $item")
}
}
val consumer: Consumer<String> = StringConsumer()
consumer.consume("Hello") // 逆变允许这样使用
星号投影(Star Projection)
有时你可能不知道泛型类型的具体参数,但仍然希望安全地使用泛型类型。在这种情况下,可以使用星号投影。例如:
fun printList(list: List<*>) {
for (item in list) {
println(item)
}
}
printList(listOf(1, 2, 3))
printList(listOf("a", "b", "c"))
在这里,List<*>
表示可以是任何类型的 List
。
泛型约束和扩展
你可以对泛型参数进行多个约束。例如:
fun <T> copyWhenGreater(list: List<T>, threshold: T): List<T>
where T : CharSequence, T : Comparable<T> {
return list.filter { it > threshold }
}
val result = copyWhenGreater(listOf("a", "abc", "ab"), "ab")
println(result) // Output: [abc]
在这个例子中,泛型类型 T
必须同时实现 CharSequence
和 Comparable<T>
接口。
结论
Kotlin 的泛型提供了强大的类型安全机制,使得开发者可以编写更灵活和可重用的代码。通过泛型类、泛型函数、类型约束以及协变和逆变等特性,Kotlin 泛型能够满足各种复杂的类型需求。在实际开发中,合理使用泛型可以极大地提高代码的质量和可维护性。
---- 文章由 ChatGPT 生成