Вне проецируемого типа "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, и Котлин строго придерживается этого.