【问题标题】:Adding int and int? in Kotlin添加int和int?在科特林
【发布时间】:2016-10-19 20:14:40
【问题描述】:

我遇到了一个问题,这似乎很简单,每个人都应该在某个时候遇到过它,但在任何地方都找不到解决方案。

从 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 的观点之一:零安全性。

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    问题是,如果变量无法在操作之间更改值,kotlin 只能在 null 检查后假设变量永远不会为空。

    我不完全知道 REPL 是如何实现的,但我猜变量是作为成员插入到上下文类中的。这意味着编译器不能假设不会发生任何更改,因为另一个线程可能会更改操作之间的值。

    所以看起来这个功能在 REPL 中不起作用,但 elvis 运算符是一个非常干净的替代方案。

    【讨论】:

    • 哇,我真的没想到这会是 REPL 特有的问题。在函数中使用时,空值检查确实有效。所以var d = a + if(c != null) {c} else {0}; 确实在一个函数中工作。我一直在使用 REPL 进行测试并发现 Kotlin 的各种怪癖。我想我应该在适当的程序中这样做。谢谢。
    • ^^ 完全正确。仅仅因为 REPL 不涉及典型的生产工作流程,就有大量 REPL 特有的错误和问题
    猜你喜欢
    • 2019-05-17
    • 2022-11-23
    • 2021-05-11
    • 2012-05-08
    • 2011-11-30
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多