Kotlin:泛型、反射以及类型 T 和 T:Any 的区别

Kotlin: Generics, reflection and the difference between type T and T:Any

如果我尝试访问泛型类型 T 的 javaClass,Kotlin 编译器会抱怨 T 不是 kotlin.Any

的子类型
class Foo<T> (val t: T ){
    val cls = t.javaClass // Error, T is not a subtype of kotlin.Any
}

如果将 T 定义为 Any 的子类型,一切正常。

class Bar<T:Any> (val t: T ){
    val cls = t.javaClass // OK
}

Q1) 如果类型“T”不是“Any”的子类型,那么 class/classes 它可以是“Any”的子类型吗?

问题 2) T 的所有实例都存在 javaClass 吗?如果存在,我该如何访问它?

默认的generic upper bound不是Any而是Any?

这也意味着从可为空的参数中获取 javaClass 不是空安全的。

要从上限为 Any? 的泛型类型实例中获取 javaClass,您可以将其转换为 Any:

val cls = (t as Any).javaClass //unsafe
val clsOrNull = (t as? Any)?.javaClass //safe