"Cannot prove that Object <:< Try[U]" 在扁平函数中

"Cannot prove that Object <:< Try[U]" in flattened function

我有一个 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
}

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

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

这个表达式的类型是TableValuecontents.apply的结果)和Try[TableValue]findValue的结果)的LUB,即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你也要防备,直接返回None