2015-02-05 64 views
1

给定此类与implicit Int。使用隐式字段实例化类

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

我可以创造一个明确通过:

scala> val f = new Foo()(1) 
f: Foo = [email protected] 

但我不能用:

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

这是怎么回事与()说法?

回答

4

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

鉴于

class Foo(implicit val x: Int) 

这里是印在REPL与-Xprint:type标志的扩展表示

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)