Получение неподдерживаемого исключения при попытке 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() который, как говорят документы:

Возвращает пустой список (неизменный).

И когда вы пытаетесь что-то добавить к нему, оно вызывает исключение.