kotlin - 通用 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
,它为我提供实例D1
或D2
通过将其调用为硬编码参数f<D1>()
或f<D2>()
使用硬编码参数,比如3
and 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
在实例化D1
或D2
解决方案
唯一的方法是通过反射和具体化类型参数:
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)
}
推荐阅读
- c# - 为什么我得到两个名称相同但值不同的 cookie?
- python - Numba - @generated_jit 返回“复杂对象没有属性‘真实’”
- wordpress - 谷歌页面速度显示“从缓存插件中删除未使用的 CSS”
- sql - 不能在 MERGE 中使用 DELETE
- javascript - 无论单击哪一个,最后一个 Google 地图标记的信息窗口都会打开
- lua - 管理玩家特定变量
- grails - 将 grails 版本从 3.0.x 升级到 3.3.x 的步骤
- r - 如何为大于 r 中位数的点设置标签?
- java - java中的4-4-5会计日历
- python - 逐步将新数据附加并绘制到 matplotlib 行