
上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