首页 > 解决方案 > Kotlin 中的“任何”上限与默认值(无边界)有何不同?

问题描述

此代码无法编译,KClass 类型出现错误:

interface Foo<T> {
    val tClass: KClass<T>
}

类型参数不在其范围内。预期:任何,发现:T

这就是说 KClass 需要一个 Any 类型参数,但 T 不是 Any。

那么这些有什么区别呢?

标签: kotlingenericstypes

解决方案


为了解释这一点,最好从 Java 与 Kotlin 的类型系统之间的差异开始。

在 Java 中,所有类都从 Object 继承,并且 Object 既可以为空,也可以不为空。在 Kotlin 中,可空类型和不可空类型之间存在区别。默认情况下,基本类型是Any?

因此<T>默认为 type Any?。由于您传入的是不可为空的类型,因此您需要声明它<T: Any>而不是Any?.

因此,与表示只能将一个不可为空的类型传递给此方法的类型<T>相同。<T: Any?><T: Any>


推荐阅读