private fun raiseResponse(ex: Exception, resObj: JSONObject) {
if (_activity == null || _responseHandler == null) return
_activity.runOnUiThread {
_responseHandler.invoke(ex, resObj)
}
}
var _activity: Activity? = null
var _responseHandler: ((Exception, JSONObject) -> Unit)? = null
但是,调用RunonuithRead
的行只有在使用?.
而不是.
时才会编译。
我试过谷歌搜索,但恐怕我的术语不够。我假设对raiseResponse
第一行的空检查足以确保?.
是不需要的?
首先,请注意check和usage两次获取属性的值。由于_activity
是var
,因此可以在检查和使用之间重新分配(可能由另一个线程)。使用属性值不是空安全的,因为它可能不是所检查的值,而且编译器要求您再次检查该值。
换句话说,编译器不能将_activity
智能强制转换为不可空类型。
您可以通过将值存储在局部变量中来解决这个问题(它不能从外部更改,因此编译器可以证明它是相同的值):
val activity = _activity
if (activity == null || _responseHandler == null) return
activity.runOnUiThread {
_responseHandler.invoke(ex, resObj)
}
_activity?.let { activity ->
if (_responseHandler == null) return
activity.runOnUiThread { // safe, because it is surely the same value
_responseHandler.invoke(ex, resObj)
}
} ?: return
>
处理这种“智能强制转换是不确定的”情况的最佳方法
科特林,聪明的演员阵容是不可能的,因为表达复杂
在Kotlin中,处理可空值的惯用方法是什么,引用或转换它们
我正在尝试处理静态编程语言/Android上的改造响应: 首先,我不明白响应如何成功,主体为空。无论如何,如果我添加空检查,我也会得到“智能转换到‘xy’是不可能的,因为‘response.body()’是一个复杂的表达式”添加非空断言代码(!!)实际上,对我来说,这是两个独立的警告,但是为什么要使用空断言请求呢?
我有这个密码: 这给我留下了编译器对我大喊大叫: 我花了很长时间才明白我必须改变Vec 代码现在编译,但我完全不明白这里到底有什么问题。为什么要在Vec定义中发送代码?我的意思是,这个特性已经实现了发送克隆。对我来说,这看起来相当多余。 有人能和我分享他的智慧吗,为什么我必须这样修改代码?
不知道这是什么意思,但我在kotlin html代码库中遇到了这种语法。SCRIPT.()是什么意思? https://github.com/Kotlin/kotlinx.html/blob/master/shared/src/main/kotlin/generated/gen-tag-unions.kt#L143 剧本是一种https://github.com/Kotlin/kotlinx.ht
我发现了一个很受欢迎的问题的答案,下面的代码是: 为什么...是必需的?如果我省略了,巴别就会对我抱怨说: 它看起来像扩展语法,但是一个布尔值。我找不到能解释到底发生了什么的医生。
如何在使用Kotlin的Spring Boot中正确初始化ConfigurationProperties? 目前我喜欢下面的例子: 但是它看起来很丑陋,实际上不是一个iable,foo是常量ue,应该在启动期间初始化,将来不会改变。
我在一般类型中迷失了很多个小时。我想简化代码,但我不能强制转换对象时,它的泛型类型。我如何解决这个问题或另一个简化的方法? 错误: