我一直在研究 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/