this.data = source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>?
警告未選中cast:ArrayList <(raw)Any!>!到ArrayList? coustom數據類的數據解釋爲什麼顯示Warning未選中cast source.readArrayList(data !!。javaClass.classLoader)as ArrayList <Data>?
this.data = source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>?
警告未選中cast:ArrayList <(raw)Any!>!到ArrayList? coustom數據類的數據解釋爲什麼顯示Warning未選中cast source.readArrayList(data !!。javaClass.classLoader)as ArrayList <Data>?
通常,當您執行轉換操作時,編譯器將插入運行時檢查以查看該轉換是否有效。例如:
val s: String = f() as String
將在所產生的字節碼指令checkcast
:
checkcast java/lang/String
這是一個運行時檢查,看是否f()
結果實際上是一個String
。
但是由於泛型被刪除,ArrayList<Data>?
在運行時將只是ArrayList?
。
所以最好的虛擬機可以做的是檢查你正在施放的值是ArrayList?
,但它不能檢查它是否實際上是ArrrayList<Data>?
,這就是爲什麼演員被稱爲「未選中」的原因。
所以對:
val a: List<String> = f() as List<String>
你將得到的只是得到:
checkcast java/util/List
注意這裏如何String
丟失。
但是,這並不意味着虛擬機將您從列表中取得的任何值視爲String
,它通常只是表示在String
上發生的劇情發生在其他地方。例如,當你把一些東西名單:
val s: String = a[0]
這將成爲:
iconst_0
invokeinterface java/util/List.get:(I)Ljava/lang/Object;
checkcast java/lang/String
注意如何有一個checkcast
到String
。編譯器默認插入了該數據,就好像代碼實際上一樣:
val s: String = a[0] as String