如何在Kotlin中将任意元素强制转换为列表?

mfpqipee  于 2023-03-13  发布在  Kotlin
关注(0)|答案(5)|浏览(197)

当我尝试将Any转换为List时,就像下面的例子一样,我收到了“Unchecked cast: Any! to List”警告。对于这种问题有什么解决方法吗?

val x: List<Apples> = objectOfTypeAny as List<Apples>
ttcibm8c

ttcibm8c1#

这“只是”一个警告,说明仅仅投出并不是100%安全的。更好的选择是:

if (objectOfTypeAny is List<*>) {
        val a: List<Apples> = objectOfTypeAny.filterIsInstance<Apples>()
        ...
}

有关详细信息,请参见https://kotlinlang.org/docs/reference/typecasts.html

cgfeq70w

cgfeq70w2#

除了忽略警告(或改进设计以避免强制转换)之外,没有。
此警告意味着即使列表实际上不是List<Apples>,而是包含Apples以外的内容,强制转换也可以在运行时成功。
它的存在是因为泛型在Java中没有具体化。泛型与类型擦除一起工作。它们是编译时的安全网,而不是运行时的安全网。

oug3syen

oug3syen3#

android可序列化到数组列表的解决方案案例:

ModJsonAndDb -您的类

private fun serializableToArrayList(obj: Serializable?): ArrayList<ModJsonAndDb>? {
    return if (obj is ArrayList<*>) {
        ArrayList(obj.filterIsInstance<ModJsonAndDb>())
    } else {
        null
    }
}
fhity93d

fhity93d4#

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>()
vm0i2vca

vm0i2vca5#

作为一个扩展功能,我来到以下解决方案:

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)

相关问题