问题产生于Kotlin class delegation只允许委托构造函数参数,因此似乎迫使你为构造函数提供参数。
以下是关于此问题的具体用例的原始问题。
我想做以下事情:
val myTable1: MyTable = MyTable()
其中
MyTable
继承自ImmutableTable(src)或至少Table Table
方法委派给某些基本实现。我也想避免以下情况:
val myTable2: MyTable = MyTable.build()
即。我不想被迫使用伴侣对象/静态工厂方法。
我尝试扩展ImmutableTable
,但我得到This type has a constructor, and thus must be initialized here
。
我尝试扩展Table
接口并委托给它(以避免重新实现方法),但后来我被迫提供Table
的实例作为构造函数参数。我不能在init {}
块中初始化它。
请参阅this gist了解我的确切尝试。
使用的Kotlin版本:1.0.2
答案 0 :(得分:8)
正如评论中所提到的,Guava有ForwardingTable
可以做到这一点。但是这里的另一个选项应该适用于没有定义“转发”版本的接口。
class MyTable private constructor(table: Table<Int, Int, Int>) : Table<Int, Int, Int> by table {
constructor() : this(TreeBasedTable.create()) // or a different type of table if desired
}