用于对象属性的 Kotlin filterNotNull

hug*_*vey 5 nullable compiler-errors kotlin

我有以下(简化的)kotlin 代码:

data class Event(val name: String, val venue: Venue?)

data class Venue(val lat: Double, val lng: Double)

...

return events
        .filter { it.venue != null }
        .map { doSomething(it.venue.lat, it.venue.lng)
Run Code Online (Sandbox Code Playgroud)

该代码无法编译并出现错误Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Venue?

我明白这意味着什么,但我不明白为什么编译器无法弄清楚it.venue不能null.map调用中。

如果事件可以为空,我可以编写events.filterNotNull().name或执行其他操作,编译器不会抱怨。有没有办法对可为空的对象属性而不是可为空的对象执行相同的操作?

谢谢你的时间

yol*_*ole 3

不,无论是在当前版本的 Kotlin 中还是在当前正在考虑的任何潜在增强功能中,这是不可能的。Kotlin 编译器不够聪明,无法理解函数的语义filter,也无法知道在传递给该函数的 lambda 中执行的检查会影响不同 lambda 中的可能类型。

(甚至不可能将“Event.venue 不为 null 的 Event 集合”表达为 Kotlin 类型,更不用说推断 的接收者map将具有该类型。)

  • 是的,“filterNotNull”返回与调用它的集合类型不同的类型。 (2认同)