![](/img/trans.png)
[英]Smart cast to ‘CLASS!’ is impossible, because ‘VARIABLE’ is a mutable property that could have been changed by this time
[英]Smart cast to 'USER' is impossible, because 'whoIfollow' is a mutable property that could have been changed by this time
所以我正在學習 kotlin,課程。 我在標題中收到此錯誤。 我創建了一個名為USER的class,在這個class中有一個字段whoIfollow,他的類型是USER。 在 USER class 中有 whoHeFollows() function,它檢查 whoIfollow 是否為 null。
我用 4 種不同的方式做到了,其中兩種有效,其中兩種我得到了錯誤。 我想了解為什么會這樣,解釋它的理論。 謝謝。
我發現奇怪的是,在我看來,第一種和第三種方式應該是相同的(其他方式也一樣......但我覺得這兩種方式更相似),但是一種產生錯誤而另一種則不會......請有人為我澄清了這一點。 提前致謝。
代碼:
fun main(){
class USER(var name: String, val age: Int, var whoIfollow: USER? = null){
/*
These 2 ways work:
==========================================
fun whoHeFollows(): String{
val x = whoIfollow?.nome ?: "nobody"
return "$name follows $x"
}
==========================================
fun whoHeFollows(): String{
val whoIfollow2 = quemEuSigo
if(whoIfollow2!=null){
val x = whoIfollow2.nome
return "$name follows $x"
}
else{return "$name follows nobody"}
}
}
These 2 does not work:
==========================================
fun whoHeFollows(): String{
whoIfollow?.let{
val x = whoIfollow.nome
return "$name follows nobody"
}
}
==========================================
fun whoHeFollows(): String{
if(whoIfollow!=null){
val x = whoIfollow.name
return "$name segue $x"
}
else{return "$name follows nobody"}
}
==========================================
WHY?
*/
}
val x = USER("luiz",25)
val y = USER("joao", 15)
//x.whoIfollow = y
y.whoIfollow = x
println(x.whoHeFollows())
println(y.whoHeFollows())
}
錯誤消息基本上解釋了這里發生的事情。 whoIfollow
屬性是可變的,因此在您檢查它不是 null 之后,其他線程可能會將其更改為 null,然后whoIfollow.nome
將導致NullPointerException
。
第一個例子有效,因為?.
運算符將非空值傳遞給下一步。 它不會兩次訪問該屬性。 它獲取屬性值,檢查此值是否為 null,如果它不是 null,則它會根據已檢查的完全相同的值調用name
。
第二個例子有效,因為局部變量whoIfollow2
不能被任何人修改,所以如果已經檢查了 null,那么它就不能改變。
如果您使用it.name
而不是whoIfollow.nome
,第三個示例將起作用。 它類似於第一個示例:它獲取屬性一次,如果它不是 null,則再次使用相同的值獲取name
。
第四行不行。 whoIfollow
屬性的值可能會在hoIfollow!=null
檢查和whoIfollow.name
之間變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.