为什么在超载的Scala功能上需要返回类型


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

这不会编译。这被记录为功能(请参阅此答案):

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

问题是:为什么?

从上面的链接 同事的一些其他想法,这是可能的原因:

  • Scala还使用返回类型来确定超载方法。是这样的,为什么它是纽带?(例如,Java不使用返回类型)
  • 部分函数 - 如果其中一种方法没有参数,而另一种方法则可以将tojson()视为部分函数,那么不确定返回类型是字符串还是函数

我知道这是指定返回类型的任何人的最佳实践,但是为什么上述摘要不编译,如果返回类型的推理不够好,为什么它首先是在那里?

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

当方法递归时。

问题是,取决于"调用"函数的返回类型,调用可以是其同名或自身(即递归递归)。

假设:

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

versus:

def a[T <: C](obj: T): Any = {
 a(obj)
}
a(new A) //infinite recursion

由于推断递归函数的返回类型通常是有限的,因此,推断"呼叫"函数的返回类型通常也是有限的时间不可否认的em>。

最新更新