作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
代码:
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>
}
这种方法的局限性是:
DataContainerRegistry
单例)可以直接访问 preloaded
map get
方法将只返回 Set
,而不是可变接口(interface)。 这样你就知道没有人会搞砸了preloaded
每个 Set
包含在其中,然后您可以轻松地施放。
关于types - 如何将数据类型映射到该数据类型的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48959121/
我是一名优秀的程序员,十分优秀!