【2023】Kotlin教程
第二篇 面向对象与函数式编程
第14章 泛型
使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型特性对Kotlin影响最大是在集合中使用泛型。
14.1 泛型函数
泛型可以应用于函数声明、属性声明、泛型类和泛型接口。
14.1.1 声明泛型函数
首先考虑一个问题,怎样声明一个函数来判断两个参数是否相等呢?如果参数是Int类型,则函数声明如下:
private fun isEqualsInt(a: Int, b: Int): Boolean {
return (a == b)
}
这个函数参数列表是两个Int类型,它只能比较两个Int类型参数是否相等。如果想比较两个Double类型是否相等,可以修改上面声明的函数如下:
private fun isEqualsInt(a: Double, b: Double): Boolean {
return (a == b)
}
这个函数参数列表是两个Double类型,它只能比较两个Double类型参数是否相等。如果想比较两个String类型是否相等,可以修改上面声明的函数如下:
private fun isEqualsInt(a: String, b: String): Boolean {
return (a == b)
}
以上分别对3种类型的两个参数进行了比较,声明了类似的3个函数。那么是否可以声明一个函数使之能够比较3种类型呢?合并后的代码:
private fun <T> isEqualsInt(a: T, b: T): Boolean {
return (a == b)
}
在函数名isEquals前面添加<T>这就是泛型函数了,<T>是声明类型参数,T是类型参数,函数中参数类型也被声明为T,在调用函数时T会用实际的类型替代。
【提示】泛型中类型参数,可以是任何大写或小写的英文字母,一般情况下人们习惯于使用字母T、E、K和U等大写英文字母。
调用泛型函数代码:
private fun <T> isEqualsInt(a: T, b: T): Boolean {
return (a == b)
}
fun main() {
println(isEqualsInt(1, 5))
println(isEqualsInt(1.0, 2.0))
println(isEqualsInt("abc", "abc"))
}
调用时自动将T完成替换。