2016-01-24 67 views
1

我可能有一個簡單的愚蠢問題,如何使用Scala Map來存儲不同的值類型,例如,我想要存儲字符串和雙值的Map,我試着下面的代碼:如何在scala中存儲不同的值類型

var yaraMap: Map[String, AnyRef] = Map() 
yaraMap+={"as"->10.0} 
yaraMap+={"bb"->'val'} 

但它告訴類型不匹配,我該如何解決這個問題,謝謝!

回答

9

定義你的地圖爲

val yaraMap: Map[String, Any] = Map() 

AnyDoubleString共同的超類型。

下圖顯示了AnyValAnyRef是如何關聯的。 StringAnyRef的亞型,DoubleAnyVal的亞型,它們的共同超型是Any

image source

+0

謝謝大衛,爲什麼AnyRef和對象不好,但任何請。 – Jack

+2

因爲'Double'不是'AnyRef'它的'AnyVal' –

+0

非常感謝David對於漂亮的照片:) – Jack

1

從大衛弗蘭克答案是偉大的。這是一個小的改進,使代碼類型安全(注意:任何和AnyRef將允許你添加任何其他類型的地圖沒有編譯器抱怨)。

如果你只是想你的價值觀是雙人牀或字符串,你可以這樣做:

var yaraMap: Map[String, Either[Double, String]] = Map() 
yaraMap+={"as"->Left(10.0)} 
yaraMap+={"bb"->Right("val")} 

可以說是更冗長,但至少如果你嘗試添加,它會破壞說List()或任何其他類型。

yaraMap+={"as"->Left(34)} 
<console>:9: error: type mismatch; 
found : List[String] 
required: Double 
       yaraMap+={"as"->Left(List("a"))} 
+1

太棒了!Coooooool! – Jack