鉴于此代码:
class Rational(n: Int, d: Int) {
require(d != 0)
private val g = gcd(n.abs, d.abs)
val numerator = n / g
val denominator = d / g
def this(n: Int) = this(n, 1)
override def toString = numerator + "/" + denominator
def +(r: Rational) = new Rational(numerator * r.denominator + r.numerator * denominator, denominator * r.denominator)
def *(r: Rational) = new Rational(numerator * r.numerator, denominator * r.denominator)
def +(i: Int) = new Rational(i) + this
private def gcd(a: Int, b: Int) : Int = {
if (b == 0) a else gcd(b, a % b)
}
}
为什么scala不能推断+(i:Int)返回一个Rational数字? (fsc给出overloaded method + needs result type
错误)
如果我将该方法更改为:
def +(i: Int): Rational = { new Rational(i) + this }
它有效......
答案 0 :(得分:26)
我在scala邮件列表中找到了一个完全相同的问题here。那里的答案解释了为什么需要给出返回类型。在进一步调查之后,我也发现了这一点:When is a return type required for methods in Scala。如果我应该从那里引用答案:
当需要显式类型注释时
实际上,您必须为以下情况提供明确的类型注释:
在以下情况下返回值的方法:
- 当您在方法中显式调用return时(即使在最后)。
- 当一个方法递归时。
- 当方法重载并且其中一个方法调用另一个方法时。调用方法需要返回类型注释。
- 当推断的返回类型比您预期的更为通用时,例如
Any
。
答案 1 :(得分:3)
在这种情况下,它可以推断出正确的类型,但它并不够聪明。使用重载方法构建一些病态示例很容易,事情变得非常混乱,所以我想这就是为什么Scala团队决定明确切割并要求返回类型。这类似于递归方法,你需要结果类型,即使编译器在许多情况下可以推断它。