【问题标题】:Scala type inference on overloaded methodScala 类型推断重载方法
【发布时间】:2011-10-21 06:07:20
【问题描述】:

鉴于此代码:

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) 返回一个有理数? (fsc 给出overloaded method + needs result type 错误)

如果我将该方法更改为:

def +(i: Int): Rational = { new Rational(i) + this }

有效...

【问题讨论】:

    标签: scala type-inference


    【解决方案1】:

    我在 scala 邮件列表中找到了一个与 here 完全相同的问题的线程。那里的答案解释了为什么需要给出返回类型。在进行了更多调查后,我还发现了这个:When is a return type required for methods in Scala。如果我应该从那里引用答案:

    何时需要显式类型注释。

    实际上,您必须为以下情况提供显式类型注释:

    以下情况下的方法返回值:

    • 在方法中显式调用 return 时(即使在最后)。
    • 当一个方法是递归的。
    • 当一个方法被重载并且其中一个方法调用另一个方法时。调用方法需要返回类型注解。
    • 当推断的返回类型比您预期的更通用时,例如,Any

    【讨论】:

      【解决方案2】:

      在这种情况下,它可以推断出正确的类型,但它还不够聪明。很容易用重载的方法构造一些​​病态的例子,让事情变得非常混乱,所以我想这就是 Scala 团队决定明确要求返回类型的原因。这类似于递归方法,您也需要结果类型,即使编译器在很多情况下都可以推断出来。

      【讨论】:

        猜你喜欢
        • 2017-09-08
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2014-12-27
        相关资源
        最近更新 更多