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
并不是无效的。
从一个泛型类型的实例获得一个javaClass
与Any?
上限,你可以把它转换成Any
:
val cls = (t as Any).javaClass //unsafe val clsOrNull = (t as? Any)?.javaClass //safe