私はこのスニペットを持っています:
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'
Kotlin star-projections は、Javaの生の型と同等ではありません。 MutableList<*>
の星印(*)は、リストから値を安全に読み取ることはできますが、リスト内の値は不明なタイプ(たとえば、Person
、 String
、Number?
、またはAny?
)。 MutableList<out Any?>
と同じです。
対照的に、MutableList<Any?>
は、リストに対して任意の値を読み書きできることを意味します。値は、同じタイプ(例:Person
)または混合タイプ(例:Person
とString
)にすることができます。
あなたの場合、dataList: MutableList<Any>
を使用したい場合があります。これは、リストに対してNULL以外の値を読み書きできることを意味します。
だから私は次のような人にキャストする必要があります:
val personList = (recyclerView.dataList as ArrayList<Person>)
personList.add( 0, Person("Lem Adane", "41 years old", 0))
dataListはArrayList <*>であり、ArrayListではなく、Kotlinはこれに厳密だからです。