Kotlin 中的 ClassCastException,即使条件语句检查它的类型是否正确

ClassCastException in Kotlin even though the conditional statement checks that it's of right type

我正在燃烧循环试图理解为什么当我知道它是一个字符串时会出现转换错误。

还有其他人在 Kotlin 中看到过这个吗? (它在倒数第二行失败)。

val stringValue =
    if (attributesMap[it] !is String) { // same as !(obj is String)
        gson.toJson(attributesMap[it])
    } else if (attributesMap[it] == null) {
        ""
    } else {
        if (attributesMap[it] is String)
            logger.info("it's a string wth...${attributesMap[it]}")
            
        attributesMap[it] // <--- The stacktrace shows this line as the culprit, and the above "it's a string line" is printed out as well
    }

这是错误:

java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.lang.String (java.util.ArrayList and java.lang.String are in module java.base of loader 'bootstrap')

更新 1:我从 Kotlin 1.4.10 升级到 1.5.30 后开始出现这种情况。它失败的输入也是一个看起来像数组的字符串:["item1", "item2"]

我想问题是 attributesMap[it] 本身不是 属性。它实际上是一个函数调用attributesMap.get(it)。 这就是编译器无法智能转换它的原因。

此外,我不确定您 if 语句的顺序。如果attributesMap[it] !is String为假,attributesMap[it] == null肯定为假。

试试这个代码,看看它是否适合你。

val value = attributes[it] // Store the value beforehand
val stringValue =
    if(value == null)
        ""
    else if(value is String)
        value
    else
        gson.toJson(value)

您也可以用 when 语句替换此 if-else 阶梯。

Playground