如果参数编译时不是实际类型,kotlin 的 javaclass.isPrimitive 会失败
kotlin's javaclass.isPrimitive fails if parameter compile-time is not actual type
代码如下
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
,
link 用于测试: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
包装器 class)。
当您将类型声明为 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
isn't there a method like "isPrimitive" for wrapper classes
不是直接的,但是你可以通过
检查一个值是否属于包装器class
value::class.javaPrimitiveType != null
或者,如果您只有 clazz: Class<T>
、
clazz.kotlin.javaPrimitiveType != null
代码如下
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
,
link 用于测试: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
包装器 class)。
当您将类型声明为 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
isn't there a method like "isPrimitive" for wrapper classes
不是直接的,但是你可以通过
检查一个值是否属于包装器classvalue::class.javaPrimitiveType != null
或者,如果您只有 clazz: Class<T>
、
clazz.kotlin.javaPrimitiveType != null