2012-12-09 88 views
2

我正在Scala中編寫一個數據結構(基本上是一個HashMap),它將採用一個元組(每次可能有不同數量的元組),並對其進行處理。一般地實現這一點,我定義的類型:具有多個子類型的Scala通用(元組)類型

type T <: Tuple1[_] with Tuple2[_,_] with Tuple3[_,_,_] with Tuple4[_,_,_,_] with Tuple5[_,_,_,_,_] 

,然後將數據結構

val map = new HashMap[Int, T] 

但這是醜陋的,因爲我有我每次要處理更多的參數,及時更改類型一個元組。有沒有定義一個通用的元組類型?

謝謝, Y.K.

+2

也許你會對'Product'滿意?是的,它允許不僅傳遞元組,但它是非常通用的 –

+0

爲什麼你將數據結構的值類型專門限制爲元組?你打算利用所有元組類型共有的某些屬性嗎? –

+0

謝謝你的回覆。我將ds限制爲元組,因爲這是用戶最終會輸入的內容(例如(3,4.5,「foo」)),我想避免類型轉換。我可以使用產品是的,但是當我得到每個T後,我必須有不同類型的正則表達式匹配。類似varT匹配{case(_,_)=> ... case(_,_,_)=> ...}等等......對嗎? –

回答

4

第一種解決方案是使用Product,如@ om-nom-nom所述。的確,它是所有元組中唯一的常見超類型。

val map = Map.empty[Int, Product] 
map + (2 -> ("a", "b")) 

然後使用方法productArityproductElementproductIterator處理返回值。

您還可以使用列表(或任何索引的集合)的地圖。

val map = Map.empty[Int, List[_]] 
map + (3 -> ("a" :: "b" :: "c" :: Nil)) 
map + (2 -> List("a", "b")) 

最後的解決方案對於用戶來說並不方便,但至少您確切知道您處理的是什麼樣的集合。你也可以添加一個隱式。