Kotlin设定类型形参的上限

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 {}

学海无涯苦作舟

我的微信公众号.jpg

基本语法
  • 作者:HunterArley (联系作者)
  • 发表时间:2019-12-04 09:21
  • 版权声明:本网站部分内容转载于合作站点或其他站点,但都会注明作/译者和原出处。如有不妥之处,敬请指出。
  • 公众号转载:请在文末添加作者公众号二维码