簡體   English   中英

智能轉換為“USER”是不可能的,因為“whoIfollow”是一個可變屬性,此時可能已經更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM