Объясните, почему показано предупреждение. Не отмечен ли источник-источник.readArrayList (data !!. JavaClass.classLoader) как ArrayList <Data>?

this.data = source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>? 

Warning Unchecked cast: ArrayList <(raw) Any!>! в ArrayList? Данные для класса данных coustom

Solutions Collecting From Web of "Объясните, почему показано предупреждение. Не отмечен ли источник-источник.readArrayList (data !!. JavaClass.classLoader) как ArrayList <Data>?"

Обычно, когда вы бросаете, компилятор вставляет проверку времени выполнения, чтобы убедиться, что это действие действительно. Например:

 val s: String = f() as String 

Будет иметь checkcast в результате байт-кода:

 checkcast java/lang/String 

Это проверка времени выполнения, чтобы увидеть, является ли результат f() фактически String .

Но так как generics удаляются, 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 

Обратите внимание, что в String есть checkcast . Этот приведение неявно вставляется компилятором, как если бы код был фактически:

 val s: String = a[0] as String