我有一个Map
,它可能具有相同类型的嵌套映射。每个嵌套贴图都有一个指向外部贴图的引用。
我定义了一个findValue
方法,该方法查看当前映射,如果找不到任何内容,则转到其父映射,依此类推,直到到达null
,它是最外层SymbolTable
的父映射。
我已经将这种行为放入Try
中,这样我就可以在Success
和Failure
上进行匹配;然而为了避免具有类型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
该表达式的类型是TableValue
(contents.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
。