2015-02-05 60 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)