首页 > 解决方案 > 通用 Kotlin 工厂到 DRY 构造函数参数

问题描述

我有以下简单的类层次结构。

abstract class B {
  abstract val o : Int
}

class D1 (m: Int, n: Int) : B() {
  override val o = m + n
}

class D2 (m: Int, n: Int) : B() {
  override val o = m * n
}

我需要一个“工厂函数” f,它为我提供实例D1D2通过将其调用为硬编码参数f<D1>()f<D2>()使用硬编码参数,比如3and 4。以下不起作用,但说明了我需要什么:

// won't compile; just demonstrates what I need
fun < T : B > f () : T {
  return T(3, 4)  // i. e. return T.constructor(m, n)
}

如何最好地做到这一点?任何 DRY 方式都可以,只要我3, 4在实例化D1D2

标签: kotlingenericsconstructordry

解决方案


唯一的方法是通过反射和具体化类型参数:

inline fun <reified T : B> f(m: Int = 3, n: Int = 4): T {
    val constructor = T::class.constructors.first {
        it.parameters.size == 2 &&
                it.parameters.all { param -> param.type == Int::class }
    }
    return constructor.call(m, n)
}

推荐阅读