用隐式字段实例化类

时间:2015-02-05 15:57:06

标签: scala implicit

鉴于此类具有implicit Int。

scala> class Foo(implicit val x: Int) { 
     |   def getX = x
     | }
defined class Foo

我可以通过以下方式明确创建一个:

scala> val f = new Foo()(1)
f: Foo = Foo@21aba4f3

但我不能:

scala> val f = new Foo(100)
<console>:18: error: too many arguments for constructor Foo: ()(implicit x: Int)Foo
       val f = new Foo(100)

()论证发生了什么?

1 个答案:

答案 0 :(得分:4)

只有隐式参数列表的类是具有两个参数列表的类的语法糖,第一个列是空的。

鉴于

class Foo(implicit val x: Int)

这里是使用-Xprint:type标志在REPL中打印的扩展表示

class Foo extends scala.AnyRef {
  <paramaccessor> private[this] val x: Int = _;
  implicit <stable> <accessor> <paramaccessor> def x: Int = Foo.this.x;
  def <init>()(implicit x: Int): Foo = {
    Foo.super.<init>();
    ()
  }
}

所以你可以不提供任何参数列表

implicit val x = 42 
val foo = new Foo

或同时提供

val foo = new Foo()(42)