Scala中`def`和`val`的不同类型推断

knu*_*ton 18 scala type-inference

我在应用于def和时观察到Scala类型推断的差异val.

使用def,我可以定义一个const返回类型值的抽象nullary方法Int => Int.const使用函数文字实现时,我不需要提供参数类型,因为它可以由编译器推断:

trait D {
  def const: Int => Int
}
object D extends D {
  def const = i => i + 1
}
Run Code Online (Sandbox Code Playgroud)

这可以.(在缺点方面,正在为每次访问创建一个新的函数实例D.const.)

现在考虑一个类似的结构使用val:

trait V {
  val const: Int => Int
}
object V extends V {
  val const = i => i + 1
}
Run Code Online (Sandbox Code Playgroud)

这将无法编译,失败

error: missing parameter type
   val const = i => i + 1
               ^
Run Code Online (Sandbox Code Playgroud)

为什么?

knu*_*ton 1

从 Scala 2.9.1 开始,指定为 \xe2\x80\x9cas \xe2\x80\x9d。引用SI-2742中的 Martin Odersky :

\n\n
\n

对于方法,继承的抽象方法中的返回类型被视为右侧的预期类型。对于价值观来说,没有这样的规则。因此,据我所知,这将是一个规范增强请求。

\n
\n\n

该票证的优先级较低,自 2009 年底首次讨论以来一直保持不变,因此似乎不太可能很快发生变化。

\n