编码:
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>
,则可以在获取时安全地进行强制转换。例如,您可以这样:
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
地图get
方法将仅返回Set
,而不返回可变接口。这样,您知道没有人会弄乱preloaded
每个人,而且其中每个人都将其弄乱Set
,然后您可以轻松地投掷。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句