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

Kon*_*zik 6 guava kotlin

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

以下是我关于这个问题的具体用例的原始问题.


我想做以下事情:

val myTable1: MyTable = MyTable()
Run Code Online (Sandbox Code Playgroud)

哪里

  • MyTable继承自ImmutableTable(src)或至少Table
  • 而且我不必手动将所有Table方法委托给某些基本实现.

我还想避免以下情况:

val myTable2: MyTable = MyTable.build() 
Run Code Online (Sandbox Code Playgroud)

即我不想被迫使用伴侣对象/静态工厂方法.

我试图扩展ImmutableTable,但我得到了This type has a constructor, and thus must be initialized here.

我试图扩展Table接口和委托给它(以避免重新实现方法),但后来我被迫提供一个Table构造函数参数的实例.我不能只是在init {}块中初始化它.

请看我的确切尝试的要点.

使用的Kotlin版本: 1.0.2

Pau*_*ing 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

}
Run Code Online (Sandbox Code Playgroud)

  • 这应该也可以.我假设调用代码根本不能提供"Table"实现. (2认同)