【问题标题】:Class to Instance Multimap in scalaScala中的类到实例Multimap
【发布时间】:2014-05-13 03:41:58
【问题描述】:

Class[T]s 关联到List[T]s 的惯用方式是什么?本质上,我想要与 Guava 的 ClassToInstanceMap 等效,但采用 Multimap 形式。

我不确定 Scala 的 mutable.Multimap 是否适合这里。

【问题讨论】:

    标签: scala collections multimap


    【解决方案1】:

    标准库中没有任何内容,但实现起来非常简单(使用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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多