具有动态数量类型参数的方法

时间:2014-02-13 13:53:11

标签: scala

我会合并这两种方法:

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] = {

2 个答案:

答案 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

您的示例有点轻量级,这使您难以为您推荐最佳方法。