Kotlin:泛型,反射和T型和T型之间的区别:任何

时间:2016-02-24 12:27:59

标签: generics reflection kotlin

如果我尝试访问泛型类型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'的子类型,哪个类/类可以是?的子类型?

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

1 个答案:

答案 0 :(得分:12)

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

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

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

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