为什么 Scala 对返回数据类型感到困惑?

时间:2021-05-24 15:34:33

标签: scala

我有以下 Scala 代码:

def isOpen(c: Char, openC: List[Char]) = {
  if(c == '(') openC :+ '(';
  else if(c == ')') openC.reverse.tail.reverse;
}

如果条件满足,则尝试将项目附加到 openC 列表,如果不满足,则尝试获取 openC 中除最后一个之外的所有项目一位补充道。我无法理解如何解决的问题是 Scala 正在解释此函数以返回 Any 类型,而我想要的是 List[Char]。我也尝试用 ListBuffer[Char] 类型重写它。我试图以一种函数式编程方式来完成他的工作,而不依赖于 val 声明。

这个论坛之前已经回答过一个类似的问题,它指出这是因为 Scala 在使用 if-else 语句时会“混淆”,这些语句在执行后还有进一步的操作。但我不确定这在这里如何适用。我仍在努力了解这是如何工作的。

2 个答案:

答案 0 :(得分:7)

您的 if 表达式的类型为 Any 因为

  • 如果 c 是 (,它是一个 List[Char]
  • 如果 c 是 ),它是一个 List[Char]
  • 否则,if 的任何分支都不适用,因此是 Unit

UnitList[Char] 的最小上限是 Any,因此这就是 if 的结果类型。

如果您希望结果类型为 List[Char],则必须添加一个 else 子句来捕获之前 if/{{ 未处理的情况1}} 导致 else if

答案 1 :(得分:2)

您缺少 else 语句。如果您不提供 else 语句,它将假定 Any 作为返回类型

List[Char]