kotlin.jvm.javaClass 扩展的可疑情况。
使用 ::javaClass 语法并不会像有人可能预期的那样生成 Class<T> 实例。
相反,它会创建 KProperty0<Class<T>> 类型的属性引用,在任何时候,这都是错误的,而且会导致意想不到的行为和难以检测的错误。
提供一种修正,以改用直接 .javaClass 调用或 ::class.java 语法。
示例 1:表达式接收器
当 ::javaClass 用于表达式时,该快速修复会将其替换为常规 .javaClass 调用:
fun test(a: String) {
val classRef = a::javaClass // KProperty0<Class<String>>
println(classRef) // 打印“property javaClass”,而非“class java.lang.String”
}
在应用快速修复后:
fun test(a: String) {
val classRef = a.javaClass // Class<String>
println(classRef) // 打印“java.lang.String”
}
示例 2:类型接收器
对类型使用 ::javaClass 时,该快速修复会将其替换为 ::class.java:
fun test() {
val classRef = String::javaClass // KProperty1<String, Class<String>>
println(classRef) // 打印“property javaClass”,而非“class java.lang.String”
}
在应用快速修复后:
fun test() {
val classRef = String::class.java // Class<Any>
println(classRef) // 打印“class java.lang.String”
}