У меня есть следующие фрагменты:
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'
Звездные проекции Котлина не эквивалентны исходным типам Java. Звезда (*) в MutableList<*>
означает, что вы можете безопасно считывать значения из списка, но вы не можете безопасно записывать в него значения; значения списка – это все неизвестные типы, которые могут быть Person
, String
, Number?
, или даже Any?
, т.е. MutableList<out 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, и Kotlin строго придерживается этого.