Scala:从Map [String,Any]或更好的替代方案中访问/转换条目

时间:2015-12-02 15:18:19

标签: scala dictionary casting attributes any

使用模式匹配我从AST中提取属性并将它们保存在Map [String,Any]中,因为它们可以是字符串,整数,列表等。现在我想使用案例类中的属性。为了获得我写这个方法的元素:

def getAttr(attr: Map[String, Any], key : String):Any = {
   val optElem = attr.get(key) match {
     case Some(elem) => elem
     case _ => throw new Exception("Required Attribute " + key + " not found")
  }
}

因为我总是知道每个属性值是什么类型,所以我想使用这样的值:

case class Object1(id: String, name: String)

Object1("o1", getAttr(attrMap, "name").asInstanceOf[String])

但我收到错误“scala.runtime.BoxedUnit无法强制转换为java.lang.String”

我做错了什么?或者有更好的方法来收集和使用我的属性吗?

2 个答案:

答案 0 :(得分:0)

您的getAttr实现具有类型Unit,因为您将值赋值的结果返回到optElem

修复:

def getAttr(attr: Map[String, Any], key : String):Any = {
  attr.get(key) match {
    case Some(elem) => elem
    case _ => throw new Exception("Required Attribute " + key + " not  found")
  }
}

答案 1 :(得分:0)

除了@ Nyavro的绝对正确答案之外:为避免每次使用asInstanceOf时调用getAttr,您可以为其添加类型参数:

def getAttr[R](attr: Map[String, Any], key: String): R = {
   val optElem = attr.get(key) match {
     case Some(elem) => elem
     case _ => throw new Exception("Required Attribute " + key + " not found")
   }
   optElem.asInstanceOf[R]
}

然后只是

Object1("o1", getAttr(attrMap, "name"))