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
我的猜测是生成的字节码不区分不同的专门列表,这似乎应该是优先修复的东西,但......显然不是。
我的问题是我应该如何让这段代码工作并且看起来更漂亮?关键是它应该采用 Bit
、Number
或 Boolean
中的一个 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
我知道之前有人问过这个问题,但给出的解决方案不适用于此处。
有问题的代码很简单 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
我的猜测是生成的字节码不区分不同的专门列表,这似乎应该是优先修复的东西,但......显然不是。
我的问题是我应该如何让这段代码工作并且看起来更漂亮?关键是它应该采用 Bit
、Number
或 Boolean
中的一个 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