Получение неподдерживаемого исключения при попытке AddAll в MutableList
1 ant2009 [2018-06-05 20:16:00]
Android Studio 3.2
kotlin_version 1.2.41
Я получаю mutablelist UnsupportedOperationException addAll.
Я передаю MutableList, поэтому не уверен, почему я получаю это время исполнения.
Когда я печатаю имена классов, я получаю следующие классы коллекций
I/System.out: class java.util.ArrayList
I/System.out: class java.util.Collections$EmptyList
Это метод mapper, возвращающий MutableList
override fun map(cursor: Cursor): MutableList<InsectDataModel> {
val insectDataModelList: MutableList<InsectDataModel> = mutableListOf()
cursor.moveToFirst()
while(cursor.moveToNext()) {
InsectDataModel().let {
it.friendlyName = cursor.getString(cursor.getColumnIndexOrThrow(InsectContract.COLUMN_FRIENDLY_NAME))
it.scientificName = cursor.getString(cursor.getColumnIndexOrThrow(InsectContract.COLUMN_SCIENTIFIC_NAME))
it.dangerLevel = cursor.getInt(cursor.getColumnIndexOrThrow(InsectContract.COLUMN_DANGER_LEVEL))
insectDataModelList.add(it)
}
}
cursor.close()
return insectDataModelList
}
Класс адаптера, который будет загружать список с помощью addAll
class InsectAdapter(private var insectList: MutableList<InsectDataModel>): RecyclerView.Adapter<InsectAdapter.CustomInsectHolder>() {
fun loadInsects(insectList: MutableList<InsectDataModel>) {
println(insectList.javaClass)
println(this.insectList.javaClass)
this.insectList.addAll(insectList) /* Unsupported Exception here */
notifyDataSetChanged()
}
}
Вызов insectAdapter
public void loadAllInsects(final Cursor cursor) {
insectInteractorMapper = new InsectInteractorMapperImp();
insectAdapter.loadInsects(insectInteractorMapper.map(cursor));
}
java collections kotlin
1 ответ
2 Решение michalbrz [2018-06-06 02:23:00]
Вы не показывали, как вы инициализируете InsectAdapter
но похоже, что вы делаете это из кода Java с помощью new InsectAdapter(Collections.emptyList())
.
Эта проблема заключается в том, что Java не имеет изменяемых и неизменных коллекций так же, как у Котлина.
Для кода Kotlin ваш конструктор классов выглядит следующим образом:
class InsectAdapter(private var insectList: MutableList<InsectDataModel>)
Но для Java его подпись:
InsectAdapter(@NotNull List<Integer> insectList) {..}
Поэтому ничто не защищает вас от передачи неправильного типа коллекции - неизменяемого vs mutable - от кода Java до кода Kotlin. И это именно то, что происходит здесь.
Вы (вероятно) передаете emptyList()
который, как говорят документы:
Возвращает пустой список (неизменный).
И когда вы пытаетесь что-то добавить к нему, оно вызывает исключение.