Kotlin 编译器不会警告潜在的空指针异常

Jan*_*sen 19 kotlin

我剪了这个简单的 kotlin 片段,尝试将列表元素映射到字符串,如下所示:

sealed class MySealedClass

class MyClass1 : MySealedClass()

class MyClass2 : MySealedClass()

fun doTheMapThing(elements: List<MySealedClass>): List<String> {
    return elements.flatMap {
        when (it) {
            is MyClass1 -> listOf("Yeah")
            is MyClass2 -> null
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 中flatMapwhen要么映射到列表,要么映射到null,因此 的有效返回类型whenList<String>?。我有点惊讶地看到这个编译没有任何问题。kotlin 编译器不应该对此发出警告吗?当我将 提取when到函数中时,我收到了正确的编译器错误。我在这里遗漏了一些东西还是这可能是一个错误?

使用科特林 1.5.31

Jan*_*sen 2

只是为了完整性:这是一个错误。该修复将与 Kotlin 一起发布1.7.0。有关更多详细信息,请访问:https ://youtrack.jetbrains.com/issue/KT-49658

如果您对更多细节感兴趣,可以在这里找到实际的修复:https://github.com/JetBrains/kotlin/commit/37d163d417bfe8ecd2e4baea3e5651906c96e150

一件好事是我们的示例实际上已将其纳入 kotlin 的测试代码中:

fun doTheMapThing1(elements: List<CharSequence>): List<String> {
    return elements.flatMap {
        <!TYPE_MISMATCH_WARNING!>when (it) { // NullPointerException
            is String -> listOf("Yeah")
            else -> null
        }<!>
    }
}
Run Code Online (Sandbox Code Playgroud)