Out-projected type 'ArrayList<*>' prohibits the use of 'public open fun add(index: Int, element: E): Unit defined in java.util.ArrayList'

感情迁移 提交于 2019-12-18 14:06:43

问题


I have this snippets:

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<*>
}
...
...
...

then I use that on this:

recyclerView.getDataList().add(Person("Lem Adane", "41 years old", 0))

but I get this error:

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'

回答1:


Kotlin star-projections are not equivalent to Java's raw types. The star (*) in MutableList<*> means that you can safely read values from the list but you cannot safely write values to it because the values in the list are each of some unknown type (e.g. Person, String, Number?, or possibly Any?). It is the same as MutableList<out Any?>.

In contrast, MutableList<Any?> means that you can read and write any value from and to the list. The values can be the same types (e.g. Person) or of mixed types (e.g. Person and String).

In your case you might want to use dataList: MutableList<Any> which means that you can read and write any non-null value from and to the list.




回答2:


So I have to cast to person like below:

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

because dataList is ArrayList<*> and not ArrayList and Kotlin is strict on that.



来源:https://stackoverflow.com/questions/40519921/out-projected-type-arraylist-prohibits-the-use-of-public-open-fun-addinde

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!