Scala隐式对象vs隐式val

时间:2015-10-24 12:04:04

标签: scala implicit

我在Scala中为类型类型声明implicit两种方式(一种比另一种方式少)。

implicit val instance1 = new Typeclass { def do = ??? }
implicit object instance2 extends Typeclass { def do = ??? }

他们有什么不同?在某些时候,人们应该更喜欢一个吗?我发现implicit valimplicit object更常用,我还没有找到关于implicit object的许多资源。

1 个答案:

答案 0 :(得分:14)

一个区别是object版本将被懒惰地初始化,即它的构造函数在第一次使用之前不会被调用。例如:

trait Incrementer[T] {
  def inc(x: T)
}

def increment[T](x: T)(implicit ev: Incrementer[T]) = ev.inc(x)

implicit object IntIncrementer extends Incrementer[Int] {
  println("IntIncrementer is being constructed...")

  def inc(x: Int) = x + 1
}

implicit val DoubleIncrementer extends Incrementer[Double] {
  println("DoubleIncrementer is being constructed...")

  def inc(x: Double) = x + 1D
}

请注意,在IntIncrementer使用之前,您不会看到该消息,例如

increment(1)  //this prints "IntIncrementer is being constructed..."

但是,DoubleIncrementer的消息将在定义时显示。因此implicit object的初始化是惰性的,而implicit val的初始化是严格的。