"无法证明Object<:<尝试[U]"在扁平化的功能

时间:2016-05-10 11:31:47

标签: scala implicit-typing

我有一个Map,可能会有一个相同类型的嵌套地图。每个嵌套映射都有一个返回外部映射的引用。

我已经定义了一个查看当前地图的findValue方法,如果它找不到任何内容,则转到其父级,依此类推,直到达到null是最外层SymbolTable的父级。

我已将此行为放入Try,以便我可以匹配SuccessFailure;但是为了避免使用类型a-la Try[Try[Try[ ... Try[TableVaue]... ]]],我将输出变平。

在尝试致电flatten时,我收到以下错误:Cannot prove that Object <:< Try[U]

以下是相关的代码:

class SymbolTable(val parentScope: SymbolTable) {
  type TableValue = (TypeInfo, Option[Expression], Option[SymbolTable])

  private val contents: mutable.Map[String, TableValue] = mutable.Map.empty

  private def findValue(key: String): Try[TableValue] = Try {
    if (contents contains key) contents(key)
    else parentScope findValue key
  }.flatten
}

所以我的问题是:如何在没有对我的代码进行任何重大重构的情况下完成这项工作?

1 个答案:

答案 0 :(得分:5)

if (contents contains key) contents(key)
else parentScope findValue key

此表达式的类型是TableValue的LUB(contents.apply的结果)和Try[TableValue]findValue的结果),即{{1 (或AnyRef)。

以下可能有效:

java.lang.Object

但整个表达并不好。 if (contents contains key) Try(contents(key)) else parentScope findValue key 仅在您无法避免必须捕获异常时才有用,而不是这里的情况。您可以完美地使用Try来检索Map#get。使用Option会变得更加简单:

Option

如果def findValue(key: String): Option[TableValue] = contents.get(key).orElse(parentScope.findValue(key)) 可以是parentScope,您也必须防范,直接返回null