Kotlin сделать конструктор класса данных как List, так и MutableList, но сохранить их изменяемый экземпляр - PullRequest
1 голос
/ 26 мая 2020

Я хочу создать класс данных, который может принимать как список, так и изменяемый список, и если список является экземпляром MutableList, тогда напрямую сделайте его свойством else, если это список, затем преобразуйте его в MutableList и затем сохраните его.

data class SidebarCategory(val title: String, val groups: MutableList<SidebarGroup>) {
    constructor(title: String, groups: List<SidebarGroup>) :
            this(title, if (groups is MutableList<SidebarGroup>) groups else groups.toMutableList())
}

В приведенном выше коде Platform declaration clash: The following declarations have the same JVM signature ошибка вызвана вторичным конструктором класса (2-я строка).

Как мне подойти к этому? Должен ли я использовать так называемый поддельный конструктор (Companion.invoke ()) или есть какой-то лучший обходной путь?

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

List и MutableList отображаются в один и тот же java.util.List класс ( mapped-types ), поэтому из JMV это будет выглядеть так, как будто SidebarCategory имеет два идентичных конструктора.

Вместо List вы можете использовать Collection во втором конструкторе.

0 голосов
/ 26 мая 2020

Используйте Collection вместо List, а затем создайте блок инициализации, который устанавливает его равным изменяемому списку, например:

data class SidebarCategory(val title: String, groups: Collection<SidebarGroup>) {
    val groups = mutableListOf<>(groups)
}
...