【发布时间】:2021-05-19 11:19:34
【问题描述】:
我有一个存储resultClass 的类,我想做一些类型检查并确保用户在调用getTypeSafeResults 函数时获得类型安全列表。
class MyClass<T>(
private val resultClass: Class<T>
){
fun getTypeSafeResults() : List<T> {
val results: List<Any?> = remoteFetchResults()
return results.filterIsInstance(resultClass)
}
}
这个 API 必须是 Java 友好的,因此 resultClass 是一个 Java 类。
但是,当 resultClass=Integer::class.java / resultClass=Long::class.java 时,结果包含这些的 Kotlin 版本,例如kotlin.Int / kotlin.Long,它们与filterIsInstance(resultClass) 不匹配。
有没有办法手动检查 resultClass 是否是 Java 版本的 Kotlin 类型?我已经按照下面这个 sn-p 的方式进行了尝试,但没有运气:
(当 it 是 kotlin Long 时,it.javaClass.kotlin="class kotlin.Long" 但 resultClass="long")
fun getTypeSafeResults(results: List<Any?>) : List<T> {
return results.map {
uncheckedCast(
if (resultClass.isAssignableFrom(it.javaClass)) { // doesn't match kotlin long to java Long
it
} else if (it.javaClass.kotlin == resultClass) { // doesn't match kotlin long to java Long
it
} else {
throw Exception("Attempted to cast result of type ${it.javaClass} to $resultClass")
}
)
}
}
【问题讨论】:
-
它可以与
results.filter { it.javaClass == resultClass } as List<T>一起使用吗? -
不行,resultClass 是
"long",it.javaClass 是"class java.lang.Long"。resultClass == it::class.javaObjectType或resultClass == it::class也没有