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>()
fun <X> Any?.safeCastToTypedList(desiredListElementType: Class<X>): MutableList<X?> {
if (this == null) throw IllegalStateException("Provided object is null")
if (this !is List<*>) throw IllegalStateException("Provided object not of type List")
val castedList: List<*> = this
if (castedList.any { it != null && !desiredListElementType.isInstance(it) }) throw IllegalStateException("Found element in list which is not of correct type $desiredListElementType")
return castedList.map { when(it) {
null -> null
else -> desiredListElementType.cast(it)
} }.toMutableList()
}
用法(x 为任意类型,但实际上包含String列表):
val castedList: MutableList<String?> = x.safeCastToTypedList(String::class.java)
5条答案
按热度按时间ttcibm8c1#
这“只是”一个警告,说明仅仅投出并不是100%安全的。更好的选择是:
有关详细信息,请参见https://kotlinlang.org/docs/reference/typecasts.html。
cgfeq70w2#
除了忽略警告(或改进设计以避免强制转换)之外,没有。
此警告意味着即使列表实际上不是
List<Apples>
,而是包含Apples
以外的内容,强制转换也可以在运行时成功。它的存在是因为泛型在Java中没有具体化。泛型与类型擦除一起工作。它们是编译时的安全网,而不是运行时的安全网。
oug3syen3#
android可序列化到数组列表的解决方案案例:
ModJsonAndDb -您的类
fhity93d4#
vm0i2vca5#
作为一个扩展功能,我来到以下解决方案:
用法(x 为任意类型,但实际上包含String列表):