class - 如果参数编译时不是实际类型,则kotlin的javaclass.isPrimitive失败

标签 class kotlin primitive

以下代码

fun foo(value:Double) {
    if(!value.javaClass.isPrimitive) {
        println("try again")
        return
    }
}
    println("that's nice")
}

fun main() {
    foo(0.0)
}
显示:
“真好”
但是将value类型设置为Any:
fun foo(value:Any) {
        if(!value.javaClass.isPrimitive) {
            println("try again")
            return
        }
        println("that's nice")
    }

fun main() {
    foo(0.0)
}
将显示:“再试一次”
即使value运行时类型 Double
测试链接:https://pl.kotl.in/HkghkAkF4
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/java-class.html的报价:

inline val T.javaClass: Class

Returns the runtime Java class of this object


https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#isPrimitive应该给我的权利
编辑:删除了不必要的运行{}

最佳答案

当您将类型声明为Double时,这就是原始的double(而不是Double包装器类)。

当您将类型声明为Any时,该方法将接受任何对象作为参数,因此,即使您传递原始double,该类型也会自动装箱到Double的包装对象中,而不再是原始类型。

您可以通过在play.kotlinlang.org上运行此代码段来查看此代码:

fun main() {
    useDouble(3.0)
    useAny(3.0)
}

fun useDouble(value: Double) = println("${value.javaClass.name}")
fun useAny(value: Any) = println("${value.javaClass.name}")

打印品:
double
java.lang.Double

关于class - 如果参数编译时不是实际类型,则kotlin的javaclass.isPrimitive失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55460857/

相关文章:

Java8 : double, 带有小写和大写后缀的浮点文字;类型构造函数和类型装箱/拆箱

C# 如何创建自定义类,如 "cmd.CommandType = System.Data.CommandType.Text"

Java - 类实例化和访问的基础知识

javascript - JavaScript 中的方法?

functional-programming - Kotlin 不同类型的 reduce() 函数

java - 找不到 `activityViewModels()` Hilt Android

html - WordPress 修改正文类

javascript - 带有 Node 模块的 Kotlin 协程

objective-c - int 值不是 “fitting” 的含义 - Objective-C 的 bool 或 BOOL?

java - 为什么在一种情况下乘以大数会得出错误的结果?