簡體   English   中英

Kotlin 中強制轉換變量的范圍是什么?

[英]What is the scope of casted variable in Kotlin?

當在賦值的右側強制轉換變量時,我驚訝地發現該變量仍然表現為強制類型,而不是原始定義的類型。 我做錯了什么還是編譯器問題?

代碼:

val hippoList = listOf<Hippo>(Hippo())
val hippoMutableList : MutableList<Hippo> = hippoList as MutableList<Hippo>
hippoList.add(Hippo())

由於hippoList來自List類型,因此它是不可變的。 那么嘗試在不可變類型上運行add函數如何不會導致編譯錯誤?

如果您正在執行轉換,則意味着您對執行上下文的了解不僅僅是編譯器,並且您告訴編譯器此 hippoList 是一個 MutableList,因此每次使用 hippoList 編譯器都已經知道這必須是一個 MutableList並允許您使用add方法,因為您之前已將其強制轉換為 MutableList。 實際上,您將收到運行時錯誤UnsupportedOperationException ,這意味着您並沒有真正了解有關此執行上下文的更多信息,並且您做錯了。 因此,不要在您自己的允許編譯器上使用強制轉換來完成它的工作。

在您的情況下,而不是轉換為 MutableList,使用hippoList.toMutableList()將 hippoList 轉換為 MutableList

使用時也會發生同樣的情況!! 從可空類型到非空類型,當您使用它時,當您對執行上下文的了解不僅僅是編譯器。 這是一個小例子

val someNullableType: String? = null
val thisStringIsNotNull = someNullableType!!

通過使用 !! 在 someNullableType 上,我們告訴編譯器 someNullableType 也不為空,所以我們可以寫(就像在你告訴你的 List 也是一個 MutableList 的情況下一樣)

someNullableType.length

但是我們會更早收到異常(在我們使用 !! 調整編譯器的地方)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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