Kotlin进阶实战
上QQ阅读APP看书,第一时间看更新

6.3 泛型约束、类型投影与星号投影

6.3.1 泛型约束

Kotlin跟Java一样,也拥有泛型约束(Generic Constraints)。Java使用extends关键字指明上界。

在Kotlin中使用“:”代替extends对泛型的类型上界进行约束。

1.上界

下面的代码在调用sum()函数时传入的参数只能是Number及其子类,如果是其他类型,就会报错。

Kotlin默认的上界是Any?,为何是Any?,而不是Any呢?

Any类似于Java中的Object,它是所有非空类型的超类型。但是Any不能保存null值,如果需要null作为变量的一部分,就需要使用Any?。Any?是Any的超类型,所以Kotlin默认的上界是Any?。

2.where关键字

当一个类型参数指定多个约束时,在Java中使用“&”连接多个类和接口。

而在Kotlin中,使用where关键字实现这个功能。下面的代码等价于上述Java代码,T必须继承ClassA以及实现InterfaceB。

     open class ClassA
     interface InterfaceB
     class MyClass<T>(var variable: Class<T>) where T : ClassA, T : InterfaceB