2014-02-13 155 views
2

動態數量的方法我會合並這兩種方法:與類型參數

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]) 

對於參數,我可以使用可變參數。 是否有類型的解決方案?

[更新]這個例子是重點輕量級的重點。 在我真正的用例中,Map是由我的數據庫驅動程序返回的一個對象(一個由Casbah返回的MongoDBObject)。

[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

第一個get返回一個'A',第二個get返回一個元組 - '(A,B)'。你期望合併的方法是什麼結果類型? – serejja

+1

@GovindSingh它根本就不是一個笨蛋--Yann想知道什麼,如果有的話,可以用來表示一個任意長的序列類型,來定義元組的內容 - 來代替'[A,B]'。 –

+0

@serejja我猜Yann想要一個產品[A,B,C,D,...](無效的語法來表達願望)。 –

回答

0

如果更改返回類型列表或別的東西可以使用可變參數。

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 
0

看起來好像你所需要的無形圖書館:)

相關的部分是:

Record類型,這是一個有點像Map其中類型的所有值被保留。

HList,其可以被認爲是元素類型被修整的List或任意長度Tuple

你的例子有點輕巧,這使得很難爲你提供最好的方法。

+0

查看我的更新,瞭解我的需求 –