我剪了这个简单的 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)
在 中flatMap,when要么映射到列表,要么映射到null,因此 的有效返回类型when是List<String>?。我有点惊讶地看到这个编译没有任何问题。kotlin 编译器不应该对此发出警告吗?当我将 提取when到函数中时,我收到了正确的编译器错误。我在这里遗漏了一些东西还是这可能是一个错误?
使用科特林 1.5.31
只是为了完整性:这是一个错误。该修复将与 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)
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |