Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler errors 对象属性的Kotlin filterNotNull_Compiler Errors_Kotlin_Nullable - Fatal编程技术网

Compiler errors 对象属性的Kotlin filterNotNull

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) 代码未编译,错误在类型为

我有以下(简化的)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)
代码未编译,错误
在类型为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同意,我删除了