我们正在尝试在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>
T
,键和值可能与不同的类型有关。有没有更好的方法来实现呢?
地图的包装可以是:
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]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句