Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin:按类生成工厂_Kotlin_Generics - Fatal编程技术网

Kotlin:按类生成工厂

Kotlin:按类生成工厂,kotlin,generics,Kotlin,Generics,我们正在尝试在kotlin中进行一些通用处理。基本上,对于给定的类,我们希望获得相关的生成器对象。i、 a.对于任何扩展GenericObject的对象,我们需要该对象的生成器 interface Builder<T : GenericObject> object ConcreteBuilder: Builder<ConcreteObject> 然后我们可以通过以下方式获得: inline fun <reified T : GenericObject> t

我们正在尝试在kotlin中进行一些通用处理。基本上,对于给定的类,我们希望获得相关的生成器对象。i、 a.对于任何扩展GenericObject的对象,我们需要该对象的生成器

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]