我会合并这两种方法:
def get[A](m: Map[String, Any], k: String) =
m(k).asInstanceOf[A]
def get[A, B](m: Map[String, Any], k1: String, k2: String) =
(m(k1).asInstanceOf[A], m(k2).asInstanceOf[B])
对于参数,我可以使用varargs。 是否有类型的解决方案?
[update]这个例子是轻量级的,专注于这一点。 在我的实际用例中,Map是一个由我的DB驱动程序返回的对象(一个MongoDBObject由Casbah返回)。
[update2]这是真正的代码
def getH0(query: Query, magic: Boolean = false): Iterable[Long] =
getHits(query, magic)((o: DBObject) => o.as[Long]("hits"))
def getH1[A](query: Query, magic: Boolean = false): Iterable[(A, Long)] =
getHits(query, magic)(asTuple[A, Long]("_id", "hits"))
def getH2[A, B](query: Query, magic: Boolean = false): Iterable[((A, B), Long)] =
getHits(query, magic)(asTuple3[A, B, Long](query.dimension.get.apply(0), query.dimension.get.apply(1), "hits"))
def getHits[T](query: Query, magic: Boolean = false)(f: DBObject => T): Iterable[T] = {
答案 0 :(得分:0)
如果将返回类型更改为List或其他内容,则可以使用varargs。
def get[A](m: Map[String, Any], k: String*):List[A]=
k.map(x=>m(x).asInstanceOf[A]).toList //the default return type is Seq
答案 1 :(得分:0)
看起来你需要无形库:)
相关部分是:
Record
类型,有点像Map
,其中保留了所有值的类型。
HList
,可以将其视为List
,其中元素类型已被跟踪,或者被视为任意长度的Tuple
。
您的示例有点轻量级,这使您难以为您推荐最佳方法。