Вне проецируемого типа "ArrayList<*>" запрещается использование "public open fun add(index: Int, element: E): модуль, определенный в java.util.ArrayList"

У меня есть следующие фрагменты:

class RecyclerViewAdapter internal constructor(
    val clazz: Class<out RecyclerViewViewHolder>,
    val layout: Int,
    var dataList: MutableList<*>)
...
...
...
fun RecyclerView.getDataList() : ArrayList<*> {
  return (adapter as RecyclerViewAdapter).dataList as ArrayList<*>
}
...
...
...

тогда я использую это на этом:

recyclerView.getDataList().add(Person("Lem Adane", "41 years old", 0))

но я получаю эту ошибку:

Error:(19, 31) Out-projected type 'ArrayList<*>' prohibits the use of   
'public open fun add(index: Int, element: E): Unit defined in  
java.util.ArrayList'

2 ответа

Решение

Звездные проекции Котлина не эквивалентны необработанным типам Java. Звезда (*) в MutableList<*> означает, что вы можете безопасно читать значения из списка, но вы не можете безопасно записывать значения в него, поскольку значения в списке относятся к неизвестному типу (например, Person, String, Number?или, возможно, Any?). Это так же, как MutableList<out Any?>,

По сравнению, MutableList<Any?> означает, что вы можете читать и записывать любое значение из и в список. Значения могут быть одинакового типа (например, Person) или смешанных типов (например, Person а также String).

В вашем случае вы можете использовать dataList: MutableList<Any> Это означает, что вы можете читать и записывать любое ненулевое значение из и в список.

Так что я должен привести человека, как показано ниже:

val personList = (recyclerView.dataList as ArrayList<Person>)
personList.add( 0, Person("Lem Adane", "41 years old", 0))

потому что dataList это ArrayList<*>, а не ArrayList, и Котлин строго придерживается этого.

Другие вопросы по тегам