"无法证明对象<:<尝试[U]"在扁平化函数中



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

相关内容

  • 没有找到相关文章

最新更新