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>。