代码:
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如果重要,此代码将在内部.
我认为你想要的在语言层面上是不可行的。
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)
该方法的局限性是:
DataContainerRegistry在我的示例中为单例)可以直接访问preloaded地图get方法将仅返回Set,而不是可变接口。这样你就知道没有人会搞砸preloaded,每个人都Set包含在其中,然后你就可以轻松地施放了。
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |