在Kotlin中,如何委托一个接口并只提供一个无参数的公共构造函数?

时间:2016-06-02 13:46:25

标签: guava kotlin

问题产生于Kotlin class delegation只允许委托构造函数参数,因此似乎迫使你为构造函数提供参数。

以下是关于此问题的具体用例的原始问题。

我想做以下事情:

val myTable1: MyTable = MyTable()

其中

  • MyTable继承自ImmutableTablesrc)或至少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

1 个答案:

答案 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

}