給定一個函式。例如:
suspend fun getUser(userId: Int): User? {
val result: UserApiResult? = fetchTheApi(userId)
//result != null || return null // Not smartcast
if (result == null) return null // Will make an smartcast of result from UserApiResult? to UserApiResult
return User(result.email, result.name)
}
在我的 IDE 中,特別是 Android Studio。第一個條件不會執行 smartcast,即使它明顯地做與第二個條件相同的事情(除非它在引擎蓋下做一些黑暗的事情)。
uj5u.com熱心網友回復:
智能鑄造不生效沒有好的技術原因。
但它比你認為的要復雜。result != null || return null編譯的唯一原因是因為return null有型別Nothing并且你可以強制Nothing任何東西(在這種情況下:) Boolean。
編譯器應該能夠推理,result != null否則我們將獲得Nothing(這是不可能的)的實體。但我個人很高興我永遠不必|| return null在代碼審查中看到,我想這不起作用的原因不是 Koltin 開發人員的錯誤。
我的猜測是編譯器強制Nothingfrom return nulltoBoolean并失去了該分支的語意,無法從那里回傳。
uj5u.com熱心網友回復:
我認為這只是當前編譯器的一個限制。使用當前編譯器構建該代碼會失敗,但如果您切換到新的 K2 編譯器(目前仍處于 Alpha 階段)編譯成功。
例子:
fun returnSomething(): String? = null
fun doSomething(): String? {
val result: String? = returnSomething()
result != null || return null
return result.length.toString()
}
fun main() {
println(doSomething())
}
構建輸出:
Kotlin: kotlinc-jvm 1.7.10 (JRE 1.8.0_212-b10)
Kotlin: ATTENTION!
This build uses experimental K2 compiler:
-Xuse-k2
Kotlin: performing incremental compilation analysis
Updating dependency information… [coroutines-test]
Running 'after' tasks
Finished, saving caches…
Executing post-compile tasks...
Synchronizing output directories...
01/11/2022, 18:01 - Build completed successfully with 4 warnings in 9 sec, 296 ms
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/525283.html
標籤:科特林无效的条件语句
下一篇:約束布局未正確約束
