Compiler errors 对象属性的Kotlin filterNotNull
我有以下(简化的)kotlin代码:Compiler errors 对象属性的Kotlin filterNotNull,compiler-errors,kotlin,nullable,Compiler Errors,Kotlin,Nullable,我有以下(简化的)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) 代码未编译,错误在类型为
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)
代码未编译,错误在类型为Venue?的可空接收器上只允许安全(?)或非空断言(!!)调用。
我明白这意味着什么,但我不明白为什么编译器不能在.map
调用中找出it.vention
不能为null
如果事件可为null,我可以编写events.filterNotNull().name
或其他内容,编译器不会抱怨。对于可为null的对象属性而不是可为null的对象,是否有任何方法可以执行相同的操作
感谢您抽出时间不,这是不可能的,无论是在当前版本的Kotlin中,还是在当前正在考虑的任何潜在增强中。Kotlin编译器不够聪明,无法理解
filter
函数的语义,也无法知道在传递给该函数的lambda中执行的检查将影响不同lambda中的可能类型
(甚至不可能将“Event.venture不为null的事件集合”表示为Kotlin类型,更不用说推断
map
的接收者将具有该类型。)如果它将检查所有类似情况,则编译时间将非常长
我想你下一步可以做:
events
.map { it.venue }
.filterNotNull()
.map { doSomething(it.lat, it.lng)
谢谢你的回答。那么,
filterNotNull
有什么特别之处吗?是的,filterNotNull
返回的类型与调用它的集合的类型不同。啊哈,这很有意义。编译器不仅仅是一个词法分析器。感谢您的回答。很遗憾,我无法将地图映射到场馆
,因为“真实”代码使用地图中事件
的多个属性call@yole同意,我删除了