以下代码
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
引用:
内联val T.javaClass:类
返回该对象的运行时Java类
https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#isPrimitive中的哪个应该给我正确的答案
编辑:删除了不必要的运行{}
答案 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