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

Mar*_*dik 4 generics kotlin

这可行:

class Generic<T, R>(thingy: R)
{
    val x = thingy.getX()
}
Run Code Online (Sandbox Code Playgroud)

但是参数R应该不是类签名的一部分.它仅在施工时有用.同样,泛型方法的类型参数与类的类型参数无关.

但是,这不起作用:

class Generic<T>(thingy: R)
{
    val x = thingy.getX()
}
Run Code Online (Sandbox Code Playgroud)

这也不是:

class Generic<T><R>(thingy: R)
{
    val x = thingy.getX()
}
Run Code Online (Sandbox Code Playgroud)

我没有在文档中找到答案.

mie*_*sol 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
})
Run Code Online (Sandbox Code Playgroud)

通常,工厂方法以小写字母开头(例如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
})
Run Code Online (Sandbox Code Playgroud)

正如@Alexey Romanow所指出的,Kotlin stdlib的部分使用了这种方法.

  • 标准库还有`public inline fun <T> MutableList(size:int,init :( index:Int) - > T):MutableList <T>`. (2认同)