[英]Why does this Kotlin code still require ?. to access members?
我在Kotlin類中具有以下功能:
private fun raiseResponse(ex: Exception, resObj: JSONObject) {
if (_activity == null || _responseHandler == null) return
_activity.runOnUiThread {
_responseHandler.invoke(ex, resObj)
}
}
_activity
和_responseHandler
都定義為:
var _activity: Activity? = null
var _responseHandler: ((Exception, JSONObject) -> Unit)? = null
但是,僅當我使用?.
,調用runOnUiThread
的行才會編譯?.
代替.
。
我已經嘗試過Google搜索,但恐怕缺少術語。 我假設我在raiseResponse
的第一行進行的空檢查足以確保?.
是多余的嗎?
首先,請注意,檢查和用法兩次獲得該屬性的值。 由於_activity
是var
,因此可以在檢查和用法之間重新分配它(可能由另一個線程分配)。 使用屬性值不是安全的,因為它可能不是已檢查的值,並且編譯器要求您再次檢查該值。
換句話說,編譯器無法將 _activity
智能 _activity
為非空類型。
您可以通過將值存儲在局部變量中來解決此問題(不能從外部更改它,因此編譯器可以證明它是相同的值):
val activity = _activity
if (activity == null || _responseHandler == null) return
activity.runOnUiThread {
_responseHandler.invoke(ex, resObj)
}
或者,等效地,使用諸如?.let { ... }
類的習慣用法:
_activity?.let { activity ->
if (_responseHandler == null) return
activity.runOnUiThread { // safe, because it is surely the same value
_responseHandler.invoke(ex, resObj)
}
} ?: return
也可以看看:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.