我有一个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
),即 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
。
关于scala - "Cannot prove that Object <:< Try[U]"在扁平化函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37137286/