Kotlin декларация подписи столкновения? - PullRequest
0 голосов
/ 18 июня 2019

Я знаю, что об этом уже спрашивали, но приведенные решения здесь не применимы.

Код, о котором идет речь, является простым классом:

class BitString(bits: List<Bit>) {
    constructor(bits: List<Number>): this(bits.map(::Bit))
    constructor(bits: List<Boolean>): this(bits.map(::Bit))

    var bits = bits

}

Bit - это класс, реализованный мной.

Однако я знакомлюсь:

Platform declaration clash: The following declarations have the same JVM signature (<init>(Ljava/util/List;)V):
    constructor BitString(bits: List<Bit>) defined in BitString
    constructor BitString(bits: List<Boolean>) defined in BitString
    constructor BitString(bits: List<Number>) defined in BitString

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

Мой вопрос: как мне заставить этот код работать и, желательно, выглядеть красиво? Дело в том, что он должен принимать List из Bit, Number или Boolean, чтобы класс мог быть создан из широкого диапазона коллекций.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Если вы хотите сохранить внешний вид конструктора, вы можете объединить companion object с invoke -оператором :

class BitString(val bits: List<Bit>) {
  companion object {
    @JvmName("fromNumbers")
    operator fun invoke(bits : List<Number>) = BitString(bits.map(::Bit))
    @JvmName("fromBooleans")
    operator fun invoke(bits : List<Boolean>) = BitString(bits.map(::Bit))
  }
}

Построение BitString будет выглядеть так же знакомо, как и вызов конструктора:

BitString(yourNumberList) // calls fromNumbers
BitString(listOf(true, false)) // calls fromBooleans
BitString(listOf(Bit(...))) // the actual constructor
1 голос
/ 18 июня 2019

Вы можете создать методы объекта-компаньона, например,

companion object {

fun fromBools(bits:List<Boolean>) = BitString(bits.map(::Bit))

}

, а затем вызвать его так:

BitString.fromBools(bits)

Возможно, это один из способов решения этой проблемы.

...