Kotlin:按类生成工厂
我们正在尝试在kotlin中进行一些通用处理。基本上,对于给定的类,我们希望获得相关的生成器对象。i、 a.对于任何扩展GenericObject的对象,我们需要该对象的生成器Kotlin:按类生成工厂,kotlin,generics,Kotlin,Generics,我们正在尝试在kotlin中进行一些通用处理。基本上,对于给定的类,我们希望获得相关的生成器对象。i、 a.对于任何扩展GenericObject的对象,我们需要该对象的生成器 interface Builder<T : GenericObject> object ConcreteBuilder: Builder<ConcreteObject> 然后我们可以通过以下方式获得: inline fun <reified T : GenericObject> t
interface Builder<T : GenericObject>
object ConcreteBuilder: Builder<ConcreteObject>
然后我们可以通过以下方式获得:
inline fun <reified T : GenericObject> transform(...): T {
val builder = map[T::class] as Builder<T>
...
inline fun转换(…):T{
val builder=将[T::class]映射为生成器
...
但是这不是很好,因为:
- 我们需要显式转换到
Builder
- 映射没有
的概念,键和值可能与不同的类型相关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>
}
}
Thx它做得很好
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]