java - Kotlin 检查列表中具有擦除类型的元素是否是 Java 类的实例
问题描述
我有一个存储 a 的类,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 是否是 Kotlin 类型的 Java 版本?我已经尝试过下面这段代码,但没有运气:
(什么时候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")
}
)
}
}
解决方案
我做了一些实验来更好地理解发生了什么。
所有这些都正确找到了 42:
val list = listOf(42, 32L, "bob")
println(list.filter { it::class == Int::class })
println(list.filter { it::class == java.lang.Integer::class.java.kotlin })
println(list.filter { it::class == Int::class.java.kotlin })
println(list.filter { it.javaClass == Int::class.javaObjectType })
println(list.filter { it.javaClass == java.lang.Integer::class.java })
只有这不会:
println(list.filter { it.javaClass == Int::class.java })
因此,您可以做的是确保您使用的javaObjectType
是用户为您提供的课程:
class MyClass<T : Any>(
resultClass: Class<T>
){
private val effectiveClass = resultClass.kotlin.javaObjectType
fun getTypeSafeResults() : List<T> {
val results: List<Any?> = remoteFetchResults()
return results.filterIsInstance(effectiveClass)
}
}
推荐阅读
- ios - 如何从字符串中识别 UTF-8 编码文本并将其转换为 Swift 中的笑脸\表情符号
- gcc - 如何限制导出符号的可见性?
- tsql - 从sql字符串中提取数据
- ios - 同一个控制器在 Swift 中的第二个 VC 之前(以编程方式)加载两次?
- javascript - jQuery:修改文本区域中的 A 标签
- python - 为什么如果我删除 django forms.ModelForm 中的用户名字段,注册失败?
- java - 设计一种有效的算法来找到最小化平均距离的邮局位置
- php - 当用户未能勾选框时重置 reCaptcha - FormMail 和 fmbadhandler
- c# - 确定数组是否包含全零
- php - 如何按照 URL 重定向到最终位置?