Kotlin 泛型
在软件开发中,我们常常需要编写能够处理多种数据类型的代码。Kotlin 中的泛型(Generics)提供了一种方法,使我们可以编写类型安全且可重用的代码。泛型的本质是参数化类型,即允许类型作为参数传递给类、接口和方法。这样一来,我们就能在保持类型安全的同时,避免编写重复代码。
泛型的定义和使用
定义泛型
在 Kotlin 中,泛型通过尖括号 <>
来定义。我们可以在类、接口和函数中使用泛型。以下是泛型的基本定义:
class Box<T>(t: T) {
var value = t
}
在上面的例子中,T
是一个类型参数,表示 Box
类可以接受任何类型的参数。
使用泛型
定义了泛型之后,我们可以在实例化类时指定具体的类型:
val intBox = Box(1) // T 是 Int
val stringBox = Box("Hello") // T 是 String
类型参数约束
有时候,我们希望类型参数满足某些条件,例如必须是某个类的子类或实现某个接口。这种情况下,我们可以使用类型参数约束:
fun <T : Comparable<T>> sort(list: List<T>) {
// 排序逻辑
}
在这个例子中,T
被约束为 Comparable
的子类型,因此我们可以对 T
类型的列表进行排序。
泛型函数
泛型不仅可以应用于类,还可以应用于函数。泛型函数的定义方式如下:
fun <T> singletonList(item: T): List<T> {
return listOf(item)
}
在这里,<T>
声明了一个泛型参数,singletonList
函数返回一个包含单个元素的列表,元素类型与传入的参数相同。
泛型类
除了泛型函数,Kotlin 中还可以定义泛型类。泛型类允许我们在类的定义中使用类型参数,从而使类更加通用和灵活:
class Container<T>(private val item: T) {
fun getItem(): T {
return item
}
}
在这个例子中,Container
类持有一个类型为 T
的 item
,并提供了一个获取该 item
的方法。
示例代码
// 定义一个泛型类 Box
class Box<T>(t: T) {
var value = t
}
// 定义一个泛型函数
fun <T> singletonList(item: T): List<T> {
return listOf(item)
}
// 使用类型参数约束定义一个排序函数
fun <T : Comparable<T>> sort(list: List<T>): List<T> {
return list.sorted()
}
// 定义一个泛型类 Container
class Container<T>(private val item: T) {
fun getItem(): T {
return item
}
}
fun main() {
// 使用泛型类 Box
val intBox = Box(1)
val stringBox = Box("Hello")
println("Int Box: ${intBox.value}")
println("String Box: ${stringBox.value}")
// 使用泛型函数 singletonList
val list = singletonList(42)
println("Singleton List: $list")
// 使用泛型函数 sort
val sortedList = sort(listOf(3, 1, 4, 1, 5, 9))
println("Sorted List: $sortedList")
// 使用泛型类 Container
val container = Container("Kotlin")
println("Container Item: ${container.getItem()}")
}