【2023】Kotlin教程
第二篇 面向对象与函数式编程
第14章 泛型
使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型特性对Kotlin影响最大是在集合中使用泛型。
14.4 泛型接口
不仅可以自定义泛型类还可以自定义泛型接口,泛型接口与泛型类声明的方式完全一样。下面将我们之前的泛型类示例修改称为队列接口,代码如下:
package com.dingjiaxiong
/**
* 自定义的泛型队列集合
*/
interface IQueue<T> {
/**
* 入队函数
* @param item 需要入队的元素
*/
fun queue(item: T)
/**
* 出队函数
* @return 返回出队元素
*/
fun dequeue(): T?
}
接口中的方法不需要实现
实现接口IQueue<T>具体方式有很多,可以是List(列表结构)、Set(集结构)或Hash(散列结构)等多种不同方式,下面笔者给出一个基于List实现方式,代码如下:
package com.dingjiaxiong
/**
* 自定义的泛型队列集合
*/
class ListQueue<T> : IQueue<T> {
// 声明保存队列元素集合items
private val items: MutableList<T>
// init代码块初始化集合items
init {
this.items = ArrayList()
}
/**
* 入队函数
* @param item 需要入队的元素
*/
override fun queue(item: T) {
this.items.add(item)
}
/**
* 出队函数
* @return 返回出队元素
*/
override fun dequeue(): T? {
return if (items.isEmpty()) {
null
} else {
this.items.removeAt(0)
}
}
override fun toString(): String {
return items.toString()
}
}
调用实现代码
package com.dingjiaxiong
fun main() {
val genericQueue = ListQueue<String>()
genericQueue.queue("A")
genericQueue.queue("C")
genericQueue.queue("B")
genericQueue.queue("D")
// genericQueue.queue(1) // 编译错误
println(genericQueue)
genericQueue.dequeue()
println(genericQueue)
}
需要注意的实现泛型接口的具体类也应该支持泛型,所以Queue<T>中类型参数名要与IQueue<T>接口中的类型参数名一致。