gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:37:51 30 4
gpt4 key购买 nike

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

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

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

When a method is overloaded and one of the methods calls another. The calling method needs a return type annotation.

问题是:为什么?

从上面的链接+同事的一些补充思考,这里是可能的原因:

  • scala 也使用返回类型来确定重载方法。是这样吗,为什么需要这样? (例如,Java 不使用返回类型)
  • 部分函数——如果其中一个方法没有参数而另一个方法有参数,则 toJson() 可能被视为部分函数,​​因此无法确定返回类型是 String 还是 Function

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

最佳答案

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

When a method is recursive.

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

假设:

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

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

关于scala - 为什么重载的 Scala 函数需要返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22226777/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com