我遇到了一个问题,这似乎很简单,以至于每个人都应该在某个时候碰到它,但却无法在任何地方找到解决方案。
从REPL复制:
var a : Int = 1
var c : Int? = 3
a + if (c != null) {c} else {0}
ERROR: None of the following functions can be called with supplied argument (followed by the various implementations of kotlin.int.plus())
所以我想要做的是将Int和Int加在一起?而且我希望结果是一个Int。非常简单。我当然知道!!
运算符,但我想尽可能避免使用它,因为它不是更改安全的†。
a + if (c != null) {c!!} else {0}
4
我知道以下解决方案,它处理空安全性并避免使用!!
运算符。
a + (c ?: 0)
4
我的问题如下:是否有办法使用if-else块和/或when块进行添加,这不需要使用!!
运算符。我更喜欢使用if-else而不是Elvis运算符的原因是对于没有Elvis运算符的语言的人来说是可理解的。所以我希望尽可能接近a + if (c != null) {c} else {0}
。
谢谢,如果我的问题或动机不明确或与Kotlin的设计或意图相悖,请告诉我。
†当然,我可以断言某个变量在添加时是安全的,但是这个断言将保持在那里,即使它周围的代码发生变化,可能使断言无效,从而否定一个变量Kotlin的观点:无效安全。
答案 0 :(得分:2)
问题是kotlin只能假设变量在null检查后永远不为null,如果该变量无法在操作之间改变值。
我并不完全知道如何实现REPL,但我的猜测是变量作为成员插入到上下文类中。这意味着编译器不能假设不会发生任何更改,因为另一个线程可能会更改操作之间的值。
所以看起来这个功能在REPL中不起作用,但是elvis运算符是一个非常干净的选择。