Scala 用隐式字段实例化类

Scala 用隐式字段实例化类,scala,implicit,Scala,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 man

给这个类一个
隐式
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)
scala>val f=new Foo(100)
:18:错误:构造函数Foo:()(隐式x:Int)Foo的参数太多
val f=新的Foo(100)

()
参数是怎么回事?

一个只有隐式参数列表的类对于一个有两个参数列表的类来说是语法糖,其中第一个是空的

给定

这是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>();
    ()
  }
}
或者两者兼备

val foo = new Foo()(42)

对于具有两个参数列表的类,只有隐式参数列表的类是语法糖,其中第一个参数列表为空

给定

这是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>();
    ()
  }
}
或者两者兼备

val foo = new Foo()(42)