Tob*_*bia 5 generics types kotlin
此代码无法编译,KClass 类型出现错误:
interface Foo<T> {
val tClass: KClass<T>
}
Run Code Online (Sandbox Code Playgroud)
类型参数不在其范围内。预期:任何,发现:T
这就是说 KClass 需要 Any 类型参数,但 T 不是 Any。
那么这些有什么区别呢?
<T><T: Any><T: Any?>要解释这一点,最好从 Java 与 Kotlin 类型系统之间的差异开始。
在Java中,所有类都继承自Object,并且Object可以同时为null或不为null。在 Kotlin 中,可空类型和不可空类型之间存在区别。默认情况下,基本类型是Any?
因此<T>默认类型为Any?。由于您传递的是不可为空的类型,因此您需要声明它<T: Any>而不是Any?.
因此,与和<T>相同,表示只能将不可为 null 的类型传递给此方法。<T: Any?><T: Any>