web-dev-qa-db-fra.com

Le type hors-projet 'ArrayList <*>' interdit l'utilisation de 'public open fun add (index: Int, élément: E): unité définie dans Java.util.ArrayList'

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'
17
LEMUEL ADANE

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.

30
mfulton26

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.

2
LEMUEL ADANE