scala - Scala隐式对象与隐式val

标签 scala implicit

我已经看到了两种在Scala中为类型类模式声明implicit的方法(一种比另一种少)。

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

它们有何不同?一个人在某些时候是否应该偏爱另一个?我发现implicit valimplicit object更加常用,并且我尚未找到有关implicit object的许多资源。

最佳答案

一个区别是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的初始化是严格的。

关于scala - Scala隐式对象与隐式val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33317974/

相关文章:

json - 在Scala中,如何对集合的子类型应用隐式转换?

C函数的隐式声明

C++ 隐式和显式继承构造函数调用

sql - 如何在 SQL 中使用数据透视表(不是作为 DataFrame 分组运算符)?

java - 斯卡拉/ jack 森 : Specifying the format of Date objects in Json

Scala 模式匹配在 2.10 中的递归类型上失败

scala - 为什么在Scala中将Int等原始类型删除为Object?

scala - 在 Scala 中消除隐式解析的歧义

generics - Scala - 泛型 + 隐式转换

scala - 在范围内显示时未找到隐式