我正在寻找异构地图的实现。异构映射是指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 上的类型擦除?或者,为什么我不能获取我的集合的类型参数?
我找到了几个小的 github 解决方案:
https://github.com/kennknowles/scala-heterogeneous-map
我不是在寻找什么:
编译器魔术在编译时推断编译时未知的返回类型 - 不可能
Shapeless HMap – 我需要区分
(String -> Int)
和(String -> String)
从 scala.collections.Map 继承——不可能,因为
Map[A, B]
get 是get[B]
我的情况get[Any]