如何在Kotlin中将Any转换为List?

时间:2017-07-14 16:14:26

标签: kotlin

当我尝试将Any投射到下面示例中的List时,我会收到“Unchecked cast: Any! to List”警告。这类问题有没有解决方法?

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

4 个答案:

答案 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>()