2014-06-16 22 views
0

我在地圖上獲得的值正確的數據類型的地圖

Map[String, Any] 

值可以是從字符串和雙打什麼序列和序列地圖。我想創建一個函數來識別值的類型,並在函數使用一個鍵時返回它。
我想到的想法是創建一個隱式類,它將'擴展'scala map函數庫中的get函數的功能,並將其放入我的package文件中。 事情是這樣的:

implicit class RichMap(map: Map[String, Any]) { 
    def getImplicit(key: String) = { 
    val value = map.get(key) 
    value match { 
     case None => throw NonExistentKeyException(key + "does not exist") 
     case Some(v) => v match { 
     case s: String => s 
     //Other case statements 
     } 
    } 
    } 
} 

我用這樣的:

myMap.getImplicit(key) 

正如你所看到的,它更多的是一種「蠻力force'y辦法。是否有更通用/優雅的方法可以用於我的問題陳述?

+1

只返回'v'。如果這不是你想要的,那麼你的問題就不清楚了。 – rightfold

+2

模式匹配將以哪種方式提供幫助?如果你的'Map'可以包含'Any'類型的值,編譯器就無法事先知道get方法必須返回哪個具體類型。當你有'String','Int'等情況時,'getImplicit'的返回類型仍然是'Any'。 –

回答

0

是否要返回key下的元素類型(類)?在這種情況下,怎麼樣

implicit class RichMap(map: Map[String, Any]) { 
    def getImplicit(key: String) = map.get(key).map(_.getClass) 
} 

,或者如果你真的想拋出一個異常:

implicit class RichMap(map: Map[String, Any]) { 
    def getImplicit(key: String) = { 
    map.get(key) match { 
     case None => throw NonExistentKeyException(key + "does not exist") 
     case Some(v) => v.getClass 
    } 
    } 
}