具有multitype值的哈希映射的现有解决方案

时间:2014-12-04 10:40:53

标签: scala map scala-collections type-erasure heterogeneous

我正在寻找异构地图的实现。异构映射是指具有已定义方法的结构HMap[KeyType, Any]

 get[ValueType](key : KeyType] : Option[ValueType]

+(key : KeyType, value : Any) : HMap[KeyType, Any]

Stack Overflow上有答案说明如何使用Manifest / ClassTags实现它,我有一个基本版本:

    class TypedMap[K](

        val inner:Map[(K, TypeTag[_]), Any]){

        def +[V](key: K, value: V)(implicit tag:TypeTag[V]) = new TypedMap[K](inner + ((key, tag) -> value))

        def apply[V](key:K)(implicit tag:TypeTag[V]) = inner.apply((key, tag)).asInstanceOf[V]

        def get[V](key:K)(implicit tag:TypeTag[V]) = inner.get((key, tag)).asInstanceOf[Option[V]]

    }
    val a = new TypeMap(Map(("key1" -> 1),("key2" -> "two")))
    a.get[Int]("key1")
    a.get[String]("key2")

我想知道是否存在更复杂的实现以及标准集合Map中的附加功能。

usecase从csv / mongo / sql中读取未知数量的列(某些类型在编译时是未知的),转换一些列(它们的类型在编译时已知),添加新列并传输结果映射通过rJava到R data.frame。在我的特定情况下,如果不太通用的解决方案在某种程度上更容易,我需要Map [String,Double / Int / String / Boolean / Date]。

简短的ClassTag和Manifest解决方案描述于:

How do I get around type erasure on Scala? Or, why can't I get the type parameter of my collections?

Scala: What is a TypeTag and how do I use it?

我找到了几个小的github解决方案:

https://github.com/EnMAS/EnMAS-Framework/blob/master/enmas-core/src/main/scala/org/enmas/pomdp/State.scala

https://github.com/kennknowles/scala-heterogeneous-map

我不想要的:

  1. 编译器魔法在编译时推断编译时未知的返回类型 - 不可能

  2. 无形HMap - 我需要区分(String -> Int)(String -> String)

  3. 继承自scala.collections.Map - 不可能,因为Map[A, B]获取get[B]就是我的get[Any]

0 个答案:

没有答案