当前位置: 首页 > 知识库问答 >
问题:

为什么这个科特林密码还需要?。访问成员?

裴宏壮
2023-03-14
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第一行的空检查足以确保?.是不需要的?

共有1个答案

郎增
2023-03-14

首先,请注意check和usage两次获取属性的值。由于_activityvar,因此可以在检查和使用之间重新分配(可能由另一个线程)。使用属性值不是空安全的,因为它可能不是所检查的值,而且编译器要求您再次检查该值。

换句话说,编译器不能将_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,应该在启动期间初始化,将来不会改变。

    • 我在一般类型中迷失了很多个小时。我想简化代码,但我不能强制转换对象时,它的泛型类型。我如何解决这个问题或另一个简化的方法? 错误: