【发布时间】:2016-12-16 03:09:40
【问题描述】:
我正在使用 Kotlin 编写与 Java 反射 API 配合使用的东西。我的输入是Class<*>,我需要确定该类型是双精度型还是整数型,但我需要同时支持原语和Java 使用的盒装可空类型。
这个玩具例子做了我想做的事:
when(type) {
java.lang.Double::class.java, Double::class.java -> TypesEnum.DOUBLE
java.lang.Integer::class.java, Int::class.java -> TypesEnum.INT
else -> throw IllegalArgumentException("type")
}
但是,这种方法会从 Kotlin 编译器生成以下警告:
警告:(22, 13) Kotlin:不应在 Kotlin 中使用此类。改用 kotlin.Double。 警告:(23, 13) Kotlin:不应在 Kotlin 中使用此类。请改用 kotlin.Int。
但是,Int?::class.java 是一个语法错误,the approaches suggested on an earlier question 需要 KClass 而不是 Class<*>(并且 .kotlin extension method 在我的某些输入上崩溃)。执行这种检查的正确 Kotlin 方法是什么?
编辑: 进一步调查(由@voddan 的回答提示)表明,这个问题是 Kotlin 类型反射中更普遍的怪异的症状:
fun main(args: Array<String>) {
// ::class.java of Kotlin's own Double type is just double
println(Double::class) // -> class kotlin.Double
println(Double::class.java) // -> double
// But starting from Java's nullable java.lang.Double gives an entirely different result
println(java.lang.Double::class) // -> class kotlin.Double
println(java.lang.Double::class.java) // -> class java.lang.Double
println(java.lang.Double::class.java.kotlin) // -> class kotlin.Double
println(java.lang.Double::class.java.kotlin.java) // -> class java.lang.Double
// Suggested by @mfulton26; works.
println(Class.forName("java.lang.Double")) // -> class java.lang.Double
}
所以似乎并非所有class kotlin.Doubles 都是平等的。我玩过演员表和辅助变量,结果似乎非常一致。
【问题讨论】:
标签: java reflection kotlin