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
如果我尝试访问泛型类型 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