什么是泛型?
泛型是一种定义函数或类时参数类型未指定的特性。通过使用泛型,我们可以编写可复用、类型安全的代码。Kotlin 支持泛型类、泛型接口和泛型函数。
定义泛型类和接口
我们可以使用 class
关键字定义一个泛型类,同时在类名后面使用 <T>
来指定参数类型。例如:
class Box<T>(val item: T) {
fun getItem(): T {
return item
}
}
在上述例子中,我们定义了一个 Box
类,使用 T
作为参数类型。item
属性类型和 getItem()
函数的返回类型都是 T
。
类似地,我们也可以使用 interface
关键字定义一个泛型接口:
interface List<T> {
fun getItem(position: Int): T
fun addItem(item: T)
}
在上述例子中,泛型接口 List
有一个泛型函数 getItem()
和 addItem()
。
使用泛型类和接口
当我们实例化一个泛型类时,可以使用 <T>
参数来指定具体的类型。例如:
val box: Box<String> = Box("Hello, Kotlin")
val item: String = box.getItem()
在上述例子中,我们实例化了一个 Box
类,指定了参数类型为 String
。通过 box.getItem()
我们可以获得 item
属性的值。
同样地,在实现泛型接口时,我们也可以指定具体的类型。例如:
class ArrayList<T> : List<T> {
private val items: MutableList<T> = mutableListOf()
override fun getItem(position: Int): T {
return items[position]
}
override fun addItem(item: T) {
items.add(item)
}
}
在上述例子中,我们实现了一个泛型接口 List
,并使用 ArrayList<T>
指定参数类型。
泛型函数
除了可以定义泛型类和泛型接口,Kotlin 还支持泛型函数。在函数名前面使用 <T>
来指定参数类型。例如:
fun <T> printItem(item: T) {
println(item)
}
在上述例子中,我们定义了一个泛型函数 printItem()
,指定参数类型为 T
,并打印出参数值。
类型边界
Kotlin 允许我们指定泛型的类型边界,以约束泛型参数的类型。类型边界可以是类名、接口名或其他泛型类。例如:
fun <T : Number> isEven(num: T): Boolean {
return num.toInt() % 2 == 0
}
在上述例子中,我们使用 <T : Number>
来指定泛型参数的类型必须是 Number
或其子类。然后我们可以在函数内部使用 toInt()
方法获取整数值,并判断是否为偶数。
总结
本文简单介绍了 Kotlin 的泛型基础知识,包括泛型类、泛型接口和泛型函数的定义与使用。泛型可以让我们编写更加灵活和可复用的代码,同时又保证了类型的安全性。在实际开发中,充分利用泛型可以提高代码的可读性和可维护性。
本文来自极简博客,作者:沉默的旋律,转载请注明原文链接:Kotlin 泛型基础