【2023】Kotlin教程
第二篇 面向对象与函数式编程
第14章 泛型
使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型特性对Kotlin影响最大是在集合中使用泛型。
14.3 泛型类
根据自己的需要也可以自定义泛型类和泛型接口。下面通过一个示例介绍一下泛型类。数据结构中有一种“队列”(queue)数据结构,
它的特点是遵守“先入先出”(FIFO)规则。
通过自定义队列集合实现泛型类。具体实现代码如下:
package com.dingjiaxiong
/**
* 自定义的泛型队列集合
*/
class Queue<T> {
// 声明保存队列元素集合items
private val items: MutableList<T>
// init 初始化代码, 实例化集合items
init {
this.items = ArrayList<T>()
}
/**
* 入队函数
* @param item 需要入队的元素
*/
fun queue(item: T) {
this.items.add(item)
}
/**
* 出队函数
* @return 返回出队元素
*/
fun dequeue(): T? {
return if (items.isEmpty()) {
null
} else {
this.items.removeAt(0)
}
}
override fun toString(): String {
return items.toString()
}
}
以上代码声明了Queue<T> 泛型类型的队列,<T> 是声明类型参数。
声明了一个MutableListi泛型集合成员属性items,MutableList是可变数组接口,用来保存队列中的元素。init初始化代码,实例化ArrayList对象赋值给items属性。
调用队列的示例代码:
package com.dingjiaxiong
fun main() {
val genericQueue = Queue<String>()
genericQueue.queue("A")
genericQueue.queue("C")
genericQueue.queue("B")
genericQueue.queue("D")
// genericQueue.queue(1) // 编译错误
println(genericQueue)
genericQueue.dequeue()
println(genericQueue)
}
运行的结果可见,出队后第一个元素"A",会从中队列中删除。
在声明泛型类时也可以有多个类型参数,类以于泛型函数可以使用多个不同的字母声明不同的类型参数。另外,在泛型类中也可以使用泛型约束,如下代码所示:
class Queue <T Number> {...}