【问题标题】:Kotlin: Generics, reflection and the difference between type T and T:AnyKotlin:泛型、反射以及类型 T 和 T:Any 之间的区别
【发布时间】:2016-02-24 12:27:59
【问题描述】:

如果我尝试访问泛型类型 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,如果存在,我该如何访问它?

【问题讨论】:

    标签: generics reflection kotlin


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 让我感到困惑的一件事是为什么我只需要为泛型类型转换。对于泛型 t var clsOfT = t?.javaClass,这会产生编译错误,但对于常规类型 var a : Any? = "A"; var clsOfA = a?.javaClass,这是可以的,即使两者都有上限 :Any?
    • @TomasKarlsson,+1,看起来像是 Kotlin 泛型的特性。我会找到答案的。
    • 对上面的澄清:t是泛型类型T的属性
    • @TomasKarlsson @hotkey 由于缺乏交集类型,即(T &amp; Any),这是已知的限制。见youtrack.jetbrains.com/issue/KT-10708
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2019-07-14
    相关资源
    最近更新 更多