gpt4 book ai didi

types - 如何将数据类型映射到该数据类型的集合

转载 作者:IT老高 更新时间:2023-10-28 13:46:02 25 4
gpt4 key购买 nike

代码:

abstract class DataContainer(public val path: String)
val preloaded: MutableMap<Class<out DataContainer>, HashSet<out DataContainer>> = hashMapOf()

我想知道如何让 Kotlin 意识到第一个 out DataContainer与第二个 out DataContainer 的类型相同.
所以代码如下:

fun <D: DataContainer> get(clazz: Class<D>): HashSet<D> = preloaded[clazz] as HashSet<D>

不需要as HashSet<D> (并且不容易出现类型转换错误)。我是 Kotlin 的新手,所以如果我遗漏了什么,请链接文档。此外,此代码将位于 object 中如果重要的话。

最佳答案

我认为你想要的在语言层面上是不可行的。

get 中的类型转换只要你能安全地做到这一点,方法并没有那么糟糕。我认为安全的唯一方法是控制 put方法也是。

如果您强制 D : DataContainer 类型的每个键将与 Set<D> 类型的 key 配对,你可以在获取时安全地施放。例如,你可以这样:

object DataContainerRegistry {

private val preloaded: MutableMap<Class<out DataContainer>, HashSet<DataContainer>> = hashMapOf()

fun put(dataContainer: DataContainer) {
val set = preloaded.getOrDefault(dataContainer::class.java, HashSet())
set.add(dataContainer)
preloaded[dataContainer::class.java] = set
}

fun <D : DataContainer> get(clazz: Class<D>) = preloaded.getOrDefault(clazz, HashSet()) as Set<D>

}

这种方法的局限性是:

  1. 只有一个类(在我的示例中为 DataContainerRegistry 单例)可以直接访问 preloaded map
  2. get方法将只返回 Set ,而不是可变接口(interface)。

这样你就知道没有人会搞砸了preloaded每个 Set包含在其中,然后您可以轻松地施放。

关于types - 如何将数据类型映射到该数据类型的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48959121/

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