Kotlin:泛型,反射和T和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定义为子类型任何一切都可以。

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

Q1)如果输入“T”不是“任何”的子类型,哪个类/类可以是子类?

Q2)对于T的所有实例是否存在一个javaClass,如果有,我该如何访问它?

默认的通用上限不是Any而是Any?

这也意味着从一个可为null的参数中获得一个javaClass并不是无效的。

从一个泛型类型的实例获得一个javaClassAny? 上限,你可以把它转换成Any

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