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