为什么Kotlin 1.5.31编译器未对flatMap潜在空指针风险给出警告?
问题根因
这是Kotlin 1.5.31及更早版本的编译器已知缺陷,并非配置遗漏导致。
- Kotlin标准库中
flatMap方法要求传入的lambda必须返回非空的Iterable类型,你代码中when表达式的返回类型为List<String>?,理论上应当触发类型不匹配的编译错误。但1.6.0之前的Kotlin编译器处理内联高阶函数的lambda类型推断时,存在空检查遗漏:会隐式将可空集合类型的null值等价转换为空集合,不会抛出空安全相关的警告或错误。 - 当你将when逻辑抽离为独立函数时,函数返回的
List<String>?是明确的可空类型,编译器会对非内联的函数返回值做严格的类型匹配校验,可空类型无法直接传递给要求非空Iterable的参数,因此会正常抛出编译错误。
修复方案
- 优先升级Kotlin版本到1.6.0及以上,该缺陷已在后续版本修复,升级后原代码会直接报类型不匹配错误,符合Kotlin空安全设计预期。
- 若暂时无法升级版本,可主动在lambda返回位置添加显式的空处理,例如:
return elements.flatMap { when (it) { is MyClass1 -> listOf("Yeah") is MyClass2 -> null } ?: emptyList() }
显式声明null时返回空集合,避免编译器隐式行为带来的不可控风险。
内容的提问来源于stack exchange,提问作者Jan Gassen
相关产品推荐
相关产品推荐

