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

Emm*_*ess 6 types kotlin

代码:

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

我想知道如何让Kotlin意识到第out DataContainer一种与第二种相同out DataContainer.
所以代码就像:

fun <D: DataContainer> get(clazz: Class<D>): HashSet<D> = preloaded[clazz] as HashSet<D>
Run Code Online (Sandbox Code Playgroud)

不需要as HashSet<D>(并且不容易出现错误).我是Kotlin的新手,如果我错过了某些内容,请链接文档.此外,object如果重要,此代码将在内部.

lel*_*man 1

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

get只要您能够安全地进行操作,该方法中的强制转换并没有那么糟糕。我认为安全地做到这一点的唯一方法就是控制该put方法。

如果您强制要求 type 的每个键都D : DataContainer与 type 的键配对Set<D>,那么您可以在获取时安全地进行强制转换。例如你可以这样:

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>

}
Run Code Online (Sandbox Code Playgroud)

该方法的局限性是:

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

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