"Cannot prove that Object <:< Try[U]" 在扁平函数中
"Cannot prove that Object <:< Try[U]" in flattened function
我有一个 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
我有一个 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