3

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

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

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

Stack Overflow 上有一些答案告诉如何使用 Manifests/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 中那样具有附加功能的更完整的实现。

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

简短的 ClassTag 和 Manifest 解决方案如下所述:

如何绕过 Scala 上的类型擦除?或者,为什么我不能获取我的集合的类型参数?

Scala:什么是 TypeTag,我如何使用它?

我找到了几个小的 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. Shapeless HMap – 我需要区分(String -> Int)(String -> String)

  3. 从 scala.collections.Map 继承——不可能,因为Map[A, B]get 是get[B]我的情况get[Any]

4

0 回答 0