【发布时间】:2014-05-13 03:41:58
【问题描述】:
将Class[T]s 关联到List[T]s 的惯用方式是什么?本质上,我想要与 Guava 的 ClassToInstanceMap 等效,但采用 Multimap 形式。
我不确定 Scala 的 mutable.Multimap 是否适合这里。
【问题讨论】:
标签: scala collections multimap
将Class[T]s 关联到List[T]s 的惯用方式是什么?本质上,我想要与 Guava 的 ClassToInstanceMap 等效,但采用 Multimap 形式。
我不确定 Scala 的 mutable.Multimap 是否适合这里。
【问题讨论】:
标签: scala collections multimap
标准库中没有任何内容,但实现起来非常简单(使用ClassTags 代替Class 以稍微简化API):
class ClassToInstanceMultiMap private (private val delegate: Map[ClassTag[_], List[_]]) {
def addInstance[T](x: T)(implicit ct: ClassTag[T]) =
new ClassToInstanceMultiMap(delegate + (ct -> x))
def getInstances[T](implicit ct: ClassTag[T]) = delegate.getOrElse(ct, List.empty).asInstanceOf[List[T]]
// whatever other methods you want
}
object ClassToInstanceMultiMap {
val empty = new ClassToInstanceMultiMap()
}
// usage
val cimm = ClassToInstanceMultiMap.empty.addInstance(1).addInstance(2).addInstance("a").getInstances[Int]
// returns List(1, 2)
如果您想分别存储具有相同类和不同泛型类型参数(例如Option[Int] 和Option[String])的实例,请使用TypeTags 而不是ClassTags。
【讨论】: