以下代码
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/