你能在Kotlin有一个通用的主要构造函数吗?

时间:2017-12-13 11:08:47

标签: generics kotlin

这样可行:

find

但是参数class Generic<T, R>(thingy: R) { val x = thingy.getX() } 实际上不应该是类签名的一部分。它仅在施工时有用。通用方法的类型参数与类的类型参数无关。

然而,这不起作用:

R

这两个都没有:

class Generic<T>(thingy: R)
{
    val x = thingy.getX()
}

我在documentation找不到答案。

1 个答案:

答案 0 :(得分:6)

这是不可能的。

然而,您可以使用工厂方法获得所需的结果:

interface HasX<out V> {
    val x: V
}

class Generic<T>(val x: Int) {
    companion object {
        fun <T, R : HasX<Int>> create(thingy: R) = Generic<T>(thingy.x)
    }
}

val result: Generic<String> = Generic.create(object : HasX<Int> {
    override val x: Int = 12
})

通常工厂方法以小写字母开头(例如mutableList)没有什么能阻止你以不同的方式做事:

fun <T, X : HasX<Int>> Generic(thingy: X):Generic<T> = Generic(thingy.x)

val result: Generic<String> = Generic(object : HasX<Int> {
    override val x: Int = 12
})

正如@Alexey Romanow部分所述,Kotlin stdlib使用this approach