正如我們所知,在 Kotlin 中可以創建不同型別的可變串列的可變串列,例如:
val list = mutableListOf(
MutableList<Int>(3) { 0 },
MutableList<String>(2) { "aaa" }
)
并且可以(如預期的那樣)更改主串列,例如:
list.add(MutableList<Double>(4) { 0.0 }
經過這個操作,結果println(list)如下:
[[0, 0, 0], [aaa, aaa], [0.0, 0.0, 0.0, 0.0]]
但是無法更改子串列,
例如操作:
list[0][1] = 2
list[1].add("bbb")
產生錯誤訊息:
整數文字不符合預期的型別 Nothing
和
型別不匹配:推斷型別是字串但沒有預期
分別...
我的問題是:
為什么這些嵌套的子串列 - 宣告為可變 - 表現得像它們不可變???
有沒有辦法改變這些嵌套的子串列???
順便說一句......
我已經檢查過,宣告為可變的嵌套子串列在它們都是相同型別時表現得非常正常。
在這種情況下,有可能 - 正如預期的那樣 - 更改那些嵌套的子串列......
uj5u.com熱心網友回復:
由于 MutableList 是型別化的,您必須在向其中添加項之前讓編譯器知道子串列的確切型別。以下代碼:
(list[0] as MutableList<Int>)[1] = 2
(list[1] as MutableList<String>).add("bbb")
效果很好。但是,當您嘗試強制轉換為錯誤的 MutableList 型別時,在運行時仍然會遇到問題,這就是報告警告(“未檢查的強制轉換”)的原因。
當所有子串列的型別相同時,例如Int頂級list型別由編譯器明確推斷,MutableList<MutableList<Int>>因此您不必明確告訴編譯器子串列的型別,因為它已經知道它們。但是當子串列是不同型別時,編譯器會推斷list's 型別為MutableList<MutableList<Any>>并限制您只呼叫MutableList(eg clear()) 的非型別化方法而不進行強制轉換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/339706.html
