我正在寻找异构地图的实现。异构映射是指具有已定义方法的结构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/kennknowles/scala-heterogeneous-map
我不想要的:
编译器魔法在编译时推断编译时未知的返回类型 - 不可能
无形HMap - 我需要区分(String -> Int)
和(String -> String)
继承自scala.collections.Map - 不可能,因为Map[A, B]
获取get[B]
就是我的get[Any]