为什么重载scala函数需要返回类型?

时间:2014-03-06 14:02:37

标签: scala

  def toJson[T](obj: T) = {
      gson.toJson(obj)
  }

  def toJson[T](list: Seq[T]) = {
      toJson(seqAsJavaList(list))
  }

这不编译。这被记录为一个功能(see this answer):

  

当方法重载并且其中一个方法调用另一个方法时。调用方法需要返回类型注释。

问题是:为什么?

从以上链接+同事的一些额外想法,以下是可能的原因:

  • scala也使用返回类型来确定重载方法。是这种情况,为什么会这样呢? (例如,Java不使用返回类型)
  • 部分函数 - 如果其中一个方法没有参数而另一个方法没有参数,则可以将toJson()视为部分函数,​​因此不确定返回类型是String还是Function

我知道最好的做法是指定任何人的返回类型,但为什么上面的代码片段实际上没有编译,如果返回类型推断不够好,为什么它首先出现呢?

1 个答案:

答案 0 :(得分:1)

可能不是主要原因,但请注意显式参数的另一个原因是:

  

当一个方法递归时。

问题是,根据“调用”函数的返回类型,调用可以是其同名,也可以是自身(即递归)。

让我们说:

trait C

class A extends C

def a(obj: A) = {2}

现在考虑:

def a[T <: C](obj: T): Int = {
 a(obj)
}

a(new A) //an Int, 2

def a[T <: C](obj: T): Any = {
 a(obj)
}

a(new A) //infinite recursion

由于推断递归函数的返回类型是有限时间不可判定的一般,因此推断“调用”函数的返回类型也是有限时间不可判定的一般