ArrayList <AbstractObject>добавление объектов с расширением AbstractObject невозможно. Как это исправить? - PullRequest
0 голосов
/ 08 ноября 2018

Итак, у меня есть ArrayList<AbstractObject>, тип класса abstract. И у меня есть 2 вещи, которые расширяются AbstractObject. Если я использую abstractList.add(Object1), это говорит о том, что ArrayList ожидает объект типа AbstractObject, а не Object1 . Я думал, что это возможно. Причина, по которой я хочу сделать это, состоит в том, чтобы использовать несколько объектов с двумя разными данными в одном RecyclerView. (* 1 010 *)

abstract class ListItem {

    abstract val type: Int

    companion object {
        const val TYPE_HEADER = 0
        const val TYPE_ITEM = 1
    }

}

class HeaderItem(val headerTitle: String) : ListItem() {

    val type: Int
        get() = TYPE_HEADER

}

class ObjectItem(val object: ParseObject) : ListItem() {


    val type: Int
        get() = TYPE_ITEM

}

Инициатива № 1:

var recyclerViewArray: ArrayList<out ListItem> = ArrayList()

Это ошибка, если я хочу добавить HeaderItem в этот список:

enter image description here

Инициатива № 2:

var recyclerViewArray: ArrayList<ListItem> = ArrayList()

Это говорит Type mismatch. Пробовал с as, но as пожелтел с сообщением This cast can never succeed.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Удалите out из объявления recyclerViewArray, и оно должно работать (я только что попробовал, и он работал нормально). например Я мог бы запустить эту строку кода:

recyclerViewArray.add(HeaderItem("test"))

Обратите внимание, что при удалении out вам все равно нужно сохранить тот факт, что это ArrayList из ListItem объектов. Поэтому вы должны объявить это как:

var recyclerViewArray = arrayListOf<ListItem>()

Часть вашего кода для меня не скомпилировалась, например, свойство object (я должен был ставить обратные метки) и не добавление модификатора override к свойству type в HeaderItem .

0 голосов
/ 08 ноября 2018

Возможно и работает нормально.Если в каком-либо выражении Котлин делает неверный тип, вы всегда можете указать его вручную.В вашем случае

abstractList.add(Object1 as AbstractObject)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...