scala之Scala 中的简单类型推断

findumars 阅读:104 2025-06-02 22:19:02 评论:0

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

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号