gpt4 book ai didi

Kotlin:按类生成工厂

转载 作者:行者123 更新时间:2023-12-04 17:21:36 25 4
gpt4 key购买 nike

我们正在尝试在 kotlin 中进行一些通用处理。基本上,对于给定的类,我们希望获得相关的 Builder 对象。即对于任何扩展 GenericObject 的对象,我们都需要该对象的构建器。

interface Builder<T : GenericObject> 
object ConcreteBuilder: Builder<ConcreteObject>

我们需要一个返回 ConcreteBuilder 的函数来自 ConcreteObject

我们当前的实现是一个 map :

val map = mapOf<KClass<out GenericObject>, Builder<out GenericObject>>(
ConcreteObject::class to ConcreteBuilder
)

然后我们可以用:

inline fun <reified T : GenericObject> transform(...): T {
val builder = map[T::class] as Builder<T>
...

但是这不是很好,因为:

  • 我们需要显式转换为 Builder<T>
  • map 没有T的概念,一个键和一个值可能与不同的类型相关。

有没有更好的实现方式?

最佳答案

map 的包装可以是:

class BuilderMap {

private val map = mutableMapOf<KClass<out GenericObject>, Builder<out GenericObject>>()

fun <T: GenericObject> put(key: KClass<T>, value: Builder<T>) {
map[key] = value
}

operator fun <T: GenericObject> get(key: KClass<T>): Builder<T> {
return map[key] as Builder<T>
}

}

这隐藏了丑陋,但并没有完全消除它。

使用:

val builderMap = BuilderMap()
builderMap.put(ConcreteObject::class, ConcreteBuilder)
builderMap.put(BetonObject::class, BetonBuilder)
// builderMap.put(BetonObject::class, ConcreteBuilder) – will not compile

val builder = builderMap[T::class]

关于Kotlin:按类生成工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65849484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com