kotlin - Kotlin 的具体类型对于 JVM 上的原语是否不正确?

标签 kotlin jvm-languages

如果 Kotlin 函数调用具体化了一个原语,例如 Int,则“通过”类是用于装箱的原语,而不是未装箱的版本。

inline fun <reified T> reify() = T::class

@Test fun reified_type_doesnt_match_for_primitive() {
    assertNotEquals(Int::class, reify<Int>())
    assertNotEquals(Int::class.java, reify<Int>().java)
    assertNotEquals<Any>(Int::class, reify<Int?>())

    val nullableInt: Int? = 42
    assertNotEquals(nullableInt!!.javaClass.kotlin, reify<Int>())

    assertEquals<Any>(java.lang.Integer::class.java, reify<Int>().java)
}

@Test fun reified_type_matches_for_class() {
    assertEquals(String::class, reify<String>())
}

这是一个错误吗?

最佳答案

这有点令人困惑,但当前的行为是设计使然。与我们将 T::class.java 视为原始类的方法相比,这种方法有一个主要优点。如果函数有一个 T 类型的参数,它的 Java 类在运行时总是等于 T::class.java(假设 T 是最后)。这实际上是一件非常明智的事情:

    inline fun <reified T : Any> foo(t: T) {
        assert(T::class.java == t.javaClass)
    }

这是因为泛型类型 T 的参数在运行时只能有一个引用值,如果 T 是原始类型,则该引用值必然是一个装箱值。

另请参阅 Kotlin 论坛上有关此主题的主题:https://devnet.jetbrains.com/thread/475540

关于kotlin - Kotlin 的具体类型对于 JVM 上的原语是否不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33987746/

相关文章:

unit-testing - Kotlin 协程单元测试失败,错误为 "Module with the Main dispatcher had failed to initialize"

kotlin - 如何在 Kotlin 中访问内部对象的成员

scala - Scala REPL中的递归重载语义-JVM语言

java - 如何将 Jython 文件导入 Groovy?

scala - 为什么 scala 编译器说这种类型用在非特化位置?

java - 我应该学习Scala吗?

kotlin - Kotlin:在Timertask处理程序中丢失了 'this'上下文

android - fatal error LifecycleOwners 必须在 registerForActivityResult 开始之前调用 register

swift - Swift 中有没有一种方法可以计算 3 个数字的所有可能加法、乘法、减法或除法。包括括号

clojure - 如何在命名空间的上下文中评估 clojure 数据结构?