gpt4 book ai didi

generics - Star 投影集合中的特定 KClass

转载 作者:行者123 更新时间:2023-12-02 13:37:15 26 4
gpt4 key购买 nike

我正在尝试构建一个外部模块可以注册的同步类,但我无法使泛型部分工作。

外部模块将注册 SynchronizationBundle<SynchronizableType>Synchronizator ,然后应该处理同步。

interface Synchronizable<T : Synchronizable<T>>

object SynchronizationBundles {
val bundles: MutableMap<KClass<*>, SynchronizableBundle<*>> = mutableMapOf()

fun <T : Synchronizable<T>> register(kClass: KClass<T>, bundle: SynchronizableBundle<T>) {
bundles[kClass] = bundle
}

@Suppress("UNCHECKED_CAST")
operator fun <T: Synchronizable<T>> get(kClass: KClass<T>) : SynchronizableBundle<T> {
return bundles[kClass] as? SynchronizableBundle<T> ?: throw IllegalArgumentException("No bundle for ${kClass.simpleName}")
}
}

例如,在同步操作中,它应该遍历已注册的捆绑包并能够使用 Synchronizable<T> 的特定实现。 .前面的伪代码
fun synchronize() {
bundles.forEach { bundleEntry ->
val bundle = bundles[bundleEntry.key]
val synchronizables = bundle.api.get()

remoteSynchronizables.forEach { remoteSynchronizable ->
val localSynchronizable = bundle.datastore.getByPlatformId(remoteSynchronizable.platformId)

val synchronizableToInsert = bundle.conflictStrategy.resolve(localSynchronizable, remoteSynchronizable)

synchronizableToInsert?.let {
bundle.datastore.insert(it.withUploadStatus(UploadStatus.COMPLETED))
}
}
}
}

问题是 val bundle = bundles[bundleEntry.key]返回 SynchronizableBundle<*> ,所以我不能调用 .conflictStrategy.resolve因为它需要 Synchronizable<T>
例如,这是 ConflictStrategy定义。 Api 和 Datastore 遵循相同的模式
interface ConflictStrategy<T : Synchronizable<T>>

这甚至可能吗?我敢肯定我不是第一个尝试这种方法的人。

如果我能以某种方式调用 val bundle = bundles[MySynchronizable::class]我会得到一个 SynchronizableBundle<MySynchronizable> ,但我没有成功地做到这一点。此外,类型 Synchronizator将在外部模块中使用,所以我什至不知道是否构建特定的 KClass会工作。

使用高阶函数可能会让我的生活更轻松,而且这个 Synchronizator 可能与类型无关,但我没有尝试过。

谢谢!

最佳答案

在下面,我稍微简化了代码以演示如何从外部使用这个包管理器:

object Bundles{
private val bundles: MutableMap<KClass<*>, Bundle<*>> = mutableMapOf()

fun <T> register(c: KClass<T>, b: Bundle<T>){
bundles[c]= b
}

operator fun <T> get(kClass: KClass<T>) : Bundle<T> {
return bundles[kClass] as? Bundle<T> ?: throw IllegalArgumentException("No bundle for ${kClass.simpleName}")
}

}

fun main(args: Array<String>) {
Bundles.register(String::class, Bundle())
Bundles.register(Int::class, Bundle())
Bundles.register(Number::class, Bundle())

val stringBundle = Bundles[String::class]
val intBundle = Bundles[Int::class]
val numBundle = Bundles[Number::class]
}

你已经注意到这行得通。现在,您正在尝试循环 bundles在您的 SynchronizationBundles 内.此时您无法知道 bundles 中添加了什么因此无法从中获取具体实例。恐怕您必须研究其他方法。

关于generics - Star 投影集合中的特定 KClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53646727/

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