Generics 科特林声明签名冲突?

Generics 科特林声明签名冲突?,generics,kotlin,constructor,jvm,bytecode,Generics,Kotlin,Constructor,Jvm,Bytecode,我知道以前有人问过这个问题,但给出的解决方案不适用于这里 所讨论的代码是一个简单的类: class BitString(bits: List<Bit>) { constructor(bits: List<Number>): this(bits.map(::Bit)) constructor(bits: List<Boolean>): this(bits.map(::Bit)) var bits = bits } 我的猜测是,生成的

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

所讨论的代码是一个简单的类:

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

    var bits = bits

}
我的猜测是,生成的字节码不会区分不同的专用列表,这似乎是应该优先解决的问题,但。。。显然不是


我的问题是,我应该如何让这段代码工作,最好是看起来漂亮?关键是它应该采用
布尔值
列表
,这样就可以从广泛的集合中构造类。

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

companion object {

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

}

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

如果您想保持构造函数的外观和感觉,可以将与结合使用:


看看类型擦除。这就是泛型在Java中的工作方式。这太棒了!我知道
JvmName
,但从没想过要这样使用它!
companion object {

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

}
BitString.fromBools(bits)
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(yourNumberList) // calls fromNumbers
BitString(listOf(true, false)) // calls fromBooleans
BitString(listOf(Bit(...))) // the actual constructor