当我尝试将Any
投射到下面示例中的List
时,我会收到“Unchecked cast: Any! to List
”警告。这类问题有没有解决方法?
val x: List<Apples> = objectOfTypeAny as List<Apples>
答案 0 :(得分:7)
这是&#34;只是&#34;一个警告,说它只是施放不是100%安全。更好的选择是:
if (objectOfTypeAny is List<*>) {
val a: List<Apples> = objectOfTypeAny.filterIsInstance<Apples>()
...
}
有关详细信息,请参阅https://kotlinlang.org/docs/reference/typecasts.html。
答案 1 :(得分:3)
除了忽略警告(或改进设计以避免演员表),否。
此警告意味着演员阵容可以在运行时成功,即使列表实际上不是List<Apples>
,但包含Apples
以外的其他内容。
它的存在是因为泛型不是用Java来实现的。泛型使用类型擦除。它们是编译时安全网,而不是运行时安全网。
答案 2 :(得分:0)
适用于Android的可序列化为ArrayList的解决方案:
ModJsonAndDb-您的课程
private fun serializableToArrayList(obj: Serializable?): ArrayList<ModJsonAndDb>? {
return if (obj is ArrayList<*>) {
ArrayList(obj.filterIsInstance<ModJsonAndDb>())
} else {
null
}
}
答案 3 :(得分:0)
1. Add:
inline fun <reified T> List<*>.asListOfType(): List<T>? =
if (all { it is T })
@Suppress("UNCHECKED_CAST")
this as List<T> else
null
2. Use:
val list: List<YouType> = someAnyList?.asListOfType<YouType>()