Kotlin: создание ArrayList с указанным типом c подкласса - PullRequest
2 голосов
/ 31 января 2020

Я пытаюсь создать ArrayList, содержащий абстрактный класс

abstract class Data {
    abstract var data: ArrayList<Entry>
    abstract class Entry(open var name: String)
}

Я хочу заставить ArrayList иметь только подклассы Entry

class Category : Data() {
    override var data = ArrayList<CategoryItem>()
    class CategoryItem(
        override var name: String
    ):Entry(name)
}

Но он постоянно говорит мне, что CategoryItem не является подклассом Entry в следующей строке;

override var data = ArrayList<CategoryItem>() 

Насколько я знаю, CategoryItem - это Entry. Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 31 января 2020

ArrayList в Kotlin является инвариантом по параметру generi c. Это означает, что ArrayList<CategoryItem> НЕ является подтипом ArrayList<Entry>, хотя CategoryItem расширяет Entry.

Если вы хотите переопределить список Entry списком CategoryItem, у вас есть по крайней мере двумя способами:

  1. Вы можете изменить изменяемый ArrayList на неизменяемый List (List в Kotlin является ковариантным, поэтому List<CategoryItem> является подтипом List<Entry>)

  2. Вы можете объявить вашу абстрактную переменную data как abstract var data: ArrayList<out Entry> (она называется use-site covariance ), но вы не сможете добавлять элементы в этом списке через свойство data, только чтобы получить их.

1 голос
/ 31 января 2020
abstract class Data<T:Entry>

это простой способ заставить ArrayList иметь только подклассы входа

abstract class Entry(open var name: String)
class CategoryItem(override var name: String) : Entry(name)

abstract class Data<T:Entry> {
    abstract var data: ArrayList<T>
}

class Category : Data<CategoryItem>() {
    override var data: ArrayList<CategoryItem>
        get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
        set(value) {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...