【2023】Kotlin教程
第二篇 面向对象与函数式编程
第14章 泛型
使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型特性对Kotlin影响最大是在集合中使用泛型。
14.1 泛型函数
泛型可以应用于函数声明、属性声明、泛型类和泛型接口。
14.1.3 泛型约束
在之前我们声明的fun <T> isEquals(a:T,b:T):Boolean函数事实上还有一点问题,
这是因为并不是所有的类型参数T都具有“可比性”,必须限定T的类型,如果只是数字类型比较可以限定为Number,因为lnt和Double等数字类型都继承Number,是Number的子类型。
声明类型参数时在T后面添加冒号(:)和限定类型,这种表示方式称为“泛型约束”,泛型约束主要应用于泛型函数和泛型类的声明。
举个栗子:
package com.dingjiaxiong
private fun <T : Number> isEquals(a: T, b: T): Boolean {
return (a == b)
}
fun main() {
println(isEquals(1, 5))
println(isEquals(1.0, 1.0))
}
这个时候如果再试图比较字符串
就不行了
其中<T: Number>:是带有约束的类型参数。
这个isEquals函数只能比较Number类型的参数,不能比较String等其他数据类型,为此也可以将类型参数限定为Comparable<T>接口类型,所有可比较的对象都实现Comparable<T>接口,Comparable<T>本身也是泛型类型。
package com.dingjiaxiong
import java.util.Date
fun <T : Comparable<T>> isEquals(a: T, b: T): Boolean {
return (a == b)
}
fun main() {
println(isEquals(1, 5))
println(isEquals(1.0, 1.0))
println(isEquals("a", "a"))
val d1 = Date()
val d2 = Date()
println(isEquals(d1, d2))
}