Kotlin泛型不仅允许在使用通配符形参时设定上限,还可以在定义类型形参时设定上限,用于表达传给该类型形参的实际类型要么是该上限类型,也么是该上限类型的子类。
package test0709
class Pear<T : Number> {
var col: T
constructor(col: T) {
this.col = col
}
}
fun main(args: Array<String>) {
//显式指定泛型函数的T是Int类型
var pi = Pear<Int>(4)
//显式指定泛型函数的T是Double类型
var pd: Pear<Double> = Pear(5.6)
}
定义了一个Pear类,该类的类型形参上限是Number类,表明使用Pear类时为T形参传入的实际类型参数只能是Number或Number类的子类。
泛型函数的泛型也可指定上限。
fun <T : Number> sum(vararg params: T): Double {
var sum = 0.0
for (p in params) {
sum += p.toDouble()
}
return sum
}
fun main(args: Array<String>) {
println(sum<Int>(1,2,3))
println(sum(1.2,2.3,3.4))
}
上面泛型函数指定了泛型形参T必须是Numb二或其子类。
如果要为泛型指定多个上限,需要使用单独的where子句。
//为T指定多个上限
class Cat<T> where T : Comparable<T>, T : Cloneable {}
//为T指定多个上限
fun <T> cloneWhenGreater(list: List<T>, threshold: T) where T : Comparable<T>, T : Cloneable {}