Kotlin 中的“任意”上限与默认值(无界限)有何不同?

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?>

Dan*_*cob 7

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

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

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

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


IR4*_*R42 2

默认上限(如果未指定)为Any? https://kotlinlang.org/docs/reference/generics.html#upper-bounds

<T>是相同的<T : Any?>