2017-06-22 20 views

回答

4

通常,當您執行轉換操作時,編譯器將插入運行時檢查以查看該轉換是否有效。例如:

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 

注意如何有一個checkcastString。編譯器默認插入了該數據,就好像代碼實際上一樣:

val s: String = a[0] as String 
相關問題