Kotlin создает конструктор класса данных, принимающий как List, так и MutableList, но хранит их изменяемый экземпляр

Я хочу создать класс данных, который может принимать как список, так и изменяемый список, и если список является экземпляром 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 ()) или есть какой-то лучший обходной путь?


person Animesh Sahu    schedule 26.05.2020    source источник
comment
Вы можете использовать Collection вместо List во втором конструкторе   -  person IR42    schedule 26.05.2020
comment
@ IR42 черт возьми, но как в этом случае работает Collection? Почему список не работает? Я вижу в них почти такую ​​же подпись, Collection<out E> List<out E> : Collection<E>   -  person Animesh Sahu    schedule 26.05.2020
comment
Поскольку и List, и MutableList сопоставлены с одним и тем же классом java.util.List и из JMV, похоже, что SidebarCategory имеет два идентичных конструктора. kotlinlang.org/docs/reference/java-interop.html#mapped- типы   -  person IR42    schedule 26.05.2020


Ответы (2)


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

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

person IR42    schedule 26.05.2020

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

data class SidebarCategory(val title: String, groups: Collection<SidebarGroup>) {
    val groups = mutableListOf<>(groups)
}
person LocalhostNotfound    schedule 26.05.2020
comment
Не будет работать в случае классов данных, группы должны иметь значение val. - person Animesh Sahu; 26.05.2020