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

标签 scala implicit-typing

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

该表达式的类型是 TableValue(contents.apply 的结果)和 Try[Ta​​bleValue](结果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/

相关文章:

scala - 使用 futures 和 options 检查元素是否存在于数据库中并更新它

java - 使用 Spark 通过 where 子句读取 HBase 表

c# - 为什么我应该尽可能使用隐式类型 (var)?

c# - 为什么匿名方法不能赋值给var?

scala - Scala中同时打印和返回值的惯用方式

Scala 向后兼容性

c# - 为什么 var 是坏事?

c# - C# 3.0 中隐式类型的好处是什么 >+

scala - 如何在 Scala 中测试对象的私有(private)方法