web-dev-qa-db-ja.com

投影されたタイプ「ArrayList <*>」は、「public open fun add(index:Int、element:E):Unit defined in 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'
17
LEMUEL ADANE

Kotlin star-projections は、Javaの生の型と同等ではありません。 MutableList<*>の星印(*)は、リストから値を安全に読み取ることはできますが、リスト内の値は不明なタイプ(たとえば、PersonStringNumber?、またはAny?)。 MutableList<out Any?>と同じです。

対照的に、MutableList<Any?>は、リストに対して任意の値を読み書きできることを意味します。値は、同じタイプ(例:Person)または混合タイプ(例:PersonString)にすることができます。

あなたの場合、dataList: MutableList<Any>を使用したい場合があります。これは、リストに対してNULL以外の値を読み書きできることを意味します。

30
mfulton26

だから私は次のような人にキャストする必要があります:

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

dataListはArrayList <*>であり、ArrayListではなく、Kotlinはこれに厳密だからです。

2
LEMUEL ADANE