Kotlin 声明签名冲突?

Kotlin declaration signature clash?

我知道之前有人问过这个问题,但给出的解决方案不适用于此处。

有问题的代码很简单 class:

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是我实现的class。

但是我很熟悉:

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

我的猜测是生成的字节码不区分不同的专门列表,这似乎应该是优先修复的东西,但......显然不是。

我的问题是我应该如何让这段代码工作并且看起来更漂亮?关键是它应该采用 BitNumberBoolean 中的一个 List,因此 class 可以从范围广泛的集合中构建。

您可以创建伴随对象的方法,例如

companion object {

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

}

然后这样称呼它:

BitString.fromBools(bits)

这可能是解决此问题的一种方法。

如果你想保持构造函数的外观和感觉,你可以结合 companion object with the invoke-operator:

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