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

时间:2019-04-01 17:46:59

标签: 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

引用:

  

内联val T.javaClass:类

     

返回该对象的运行时Java类

https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#isPrimitive中的哪个应该给我正确的答案

编辑:删除了不必要的运行{}

2 个答案:

答案 0 :(得分:4)

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

当您将类型声明为Any时,该方法将接受任何 object 作为参数,因此,即使您传入基本类型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

答案 1 :(得分:2)

  

包装类没有像“ isPrimitive”这样的方法

不是直接的,但是您可以通过以下方式检查值是否属于包装器类:

value::class.javaPrimitiveType != null

或者,如果您只有clazz: Class<T>

clazz.kotlin.javaPrimitiveType != null