什么是隐式对象?

时间:2014-03-23 14:52:19

标签: scala implicit

我正在阅读提到隐式对象的type classes

object Math {
  trait NumberLike[T] {
    def plus(x: T, y: T): T
    def divide(x: T, y: Int): T
    def minus(x: T, y: T): T
  }
  object NumberLike {
    implicit object NumberLikeDouble extends NumberLike[Double] {
      def plus(x: Double, y: Double): Double = x + y
      def divide(x: Double, y: Int): Double = x / y
      def minus(x: Double, y: Double): Double = x - y
    }
    implicit object NumberLikeInt extends NumberLike[Int] {
      def plus(x: Int, y: Int): Int = x + y
      def divide(x: Int, y: Int): Int = x / y
      def minus(x: Int, y: Int): Int = x - y
    }
  }
}

他们是什么?他们在哪里描述?我只在web上找到了隐式类的定义,但没有找到隐式对象的定义。

2 个答案:

答案 0 :(得分:23)

在Scala中,对象和值的处理方式大致相同。隐式对象可以被认为是在查找其类型的隐式过程中找到的值。

在您的示例中,如果隐式查找类型为NumberLikeDouble的{​​{1}}类型类,则会找到IntNumberLikeDouble

NumberLikeInt
因此

大致相同
implicit object NumberLikeDouble extends NumberLike[Double]

implicit val NumberLikeDouble: NumberLike[Double] = new NumberLike[Double] { ...}

implicit def NumberLikeDouble: NumberLike[Double] = new NumberLike[Double] { ...} 类似,该类型只有一个值,不需要实例化。


一个简单的用例:

val

答案 1 :(得分:1)

感谢隐式对象,您可以定义:

def mymethod[T : NumberLike](value: T): T = {
  implicitly[NumberLike[T]].plus(value, value)
}

允许您在Double和Floats上调用方法,因为您有对象来处理它们。

scala> mymethod(1.0)
res0: Double = 2.0

scala> mymethod(2)
res0: Int = 4

scala> mymethod("test") //Error