scala - Scala 中的简单类型推断

标签 scala type-inference

我一直在研究 Scala 中的类型推断,关于为什么在某些情况下必须显式声明表达式/方法返回类型,我想更好地理解一些事情。

显式返回声明

示例(如果省略 return 关键字则有效):

def upCase(s: String) = {
  if (s.length == 0)
    return s    // COMPILE ERROR - forces return type of upCase to be declared.
  else
    s.toUpperCase()
}

为什么我不能在不声明返回类型的情况下使用显式类型参数作为返回值?这不仅适用于直接参数引用,还适用于任何“类型可推断”表达式。

方法重载

示例(添加第二个joiner方法编译失败):

def joiner(ss: List[String], sep: String) = ss.mkString(sep)

def joiner(ss: List[String]) = joiner(strings, " ")   // COMPILE ERROR WHEN ADDED

最佳答案

最明显的答案是:因为它在规范中说明,请参阅 Scala 引用的第 6.20 部分。但是为什么要这样设计,确实是一个很有趣的问题。我怀疑它与编译器无法预测表达式将是最后一个这一事实有关,因为 return 改变了执行流程。

编辑:

考虑 return 是否不需要显式返回类型,如下代码:

def bar() = {   
  if(guard())  
    return "SS"  
  else if(gurard1())  
    return true   
  2  
}

在这种情况下 bar 应该有那个返回类型?嗯,有最常见父类(super class)型的选项,但我认为它会让我们在很多情况下返回 Any。好吧,这只是我的想法,可能完全不正确 =)

关于scala - Scala 中的简单类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1529988/

相关文章:

scala - Lift 中的数据库架构迁移

java - 为什么此代码中会出现 "value X is not a member of Y"错误?

scala - 如何从 Play 中的请求中获取 InputStream

java - 为什么 Java 不能推断父类(super class)型?

数组上的 Swift flatMap 元素是可选的,具有不同的行为

scala - 获取具有特定键的无形记录进行编译

scala - 在 Scala 中如何编写 init 函数?

f# - 如何编写通用数字的函数?

scala - 在什么条件下推断没有什么可取的?

compiler-errors - 找到预期的 XYZ ()