J'ai ces extraits:
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<*>
}
...
...
...
alors je l'utilise sur ceci:
recyclerView.getDataList().add(Person("Lem Adane", "41 years old", 0))
mais je reçois cette erreur:
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'
Kotlin étoiles-projections ne sont pas équivalents aux types bruts de Java. L'étoile (*) dans MutableList<*>
signifie que vous pouvez lire les valeurs de la liste en toute sécurité mais que vous ne pouvez pas y écrire en toute sécurité car les valeurs de la liste sont chacune d'un type inconnu (par exemple Person
, String
, Number?
, ou éventuellement Any?
). C'est la même chose que MutableList<out Any?>
.
En revanche, MutableList<Any?>
signifie que vous pouvez lire et écrire n'importe quelle valeur depuis et vers la liste. Les valeurs peuvent être de mêmes types (par exemple Person
) ou de types mixtes (par exemple Person
et String
).
Dans votre cas, vous souhaiterez peut-être utiliser dataList: MutableList<Any>
ce qui signifie que vous pouvez lire et écrire toute valeur non nulle depuis et vers la liste.
Je dois donc lancer à la personne comme ci-dessous:
val personList = (recyclerView.dataList as ArrayList<Person>)
personList.add( 0, Person("Lem Adane", "41 years old", 0))
parce que dataList est ArrayList <*> et non ArrayList et Kotlin est strict à ce sujet.