generics - Kotlin声明签名冲突?

标签 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

}
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

我的猜测是,生成的字节码无法在不同的专用列表之间进行区分,这似乎应该优先解决,但是……显然不是。

我的问题是我应该如何使此代码正常工作,并且看起来更好?关键是它应该采用ListBitNumberBoolean,以便可以从各种各样的集合中构造该类。

最佳答案

如果要保留构造函数的外观,可以将 companion object 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

关于generics - Kotlin声明签名冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56646982/

相关文章:

c# - C# : restricting the type parameter to be a collection 中的泛型

C# 将数组类型的对象转换为 T,其中 T 是数组?

JAVA泛型类方法不适用

android - 从 Firebase 监听器发出状态 - Kotlin Flow

c++多重继承和显式构造函数调用

c# - 多线程和构造函数完整性

java - 关于java中的泛型和列表

android - 无法在 XML .Android 工作室中更改按钮的背景颜色

android - 在 Kotlin 中使用 FirebaseListAdapter

c++ - arb 的静态 ctor/dtor 观察器。 C++类