def toJson[T](obj: T) = {
gson.toJson(obj)
}
def toJson[T](list: Seq[T]) = {
toJson(seqAsJavaList(list))
}
这不编译。这被记录为一个功能(see this answer):
当方法重载并且其中一个方法调用另一个方法时。调用方法需要返回类型注释。
问题是:为什么?
从以上链接+同事的一些额外想法,以下是可能的原因:
我知道最好的做法是指定任何人的返回类型,但为什么上面的代码片段实际上没有编译,如果返回类型推断不够好,为什么它首先出现呢?
答案 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
由于推断递归函数的返回类型是有限时间不可判定的一般,因此推断“调用”函数的返回类型也是有限时间不可判定的一般