我有以下(简化的)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)
代码无法使用错误Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Venue?
我理解这意味着什么,但我不明白为什么编译器无法弄清楚it.venue
调用中null
不能.map
。
如果事件可以为空,我可以写events.filterNotNull().name
或其他东西,编译器不会抱怨。对于可以为空的对象属性而不是可以为空的对象,有没有办法做同样的事情?
感谢您的时间
答案 0 :(得分:2)
不,这不可能,无论是在当前版本的Kotlin中,还是目前正在考虑的任何潜在增强功能。 Kotlin编译器不够聪明,无法理解filter
函数的语义,并且知道在传递给该函数的lambda中执行的检查将影响不同lambda中的可能类型。
(甚至没有可能表达"一个Event的集合,其中Event.venue不为null"作为Kotlin类型,更不用说推断{{1}的接收者将具有该类型。)
答案 1 :(得分:0)
如果它会检查所有类似的情况,你的编译时间将超长。
以为你可以做下一步:
events
.map { it.venue }
.filterNotNull()
.map { doSomething(it.lat, it.lng)