使用模式匹配我从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”
我做错了什么?或者有更好的方法来收集和使用我的属性吗?
答案 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"))