我正在阅读提到隐式对象的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上找到了隐式类的定义,但没有找到隐式对象的定义。
答案 0 :(得分:23)
在Scala中,对象和值的处理方式大致相同。隐式对象可以被认为是在查找其类型的隐式过程中找到的值。
在您的示例中,如果隐式查找类型为NumberLike
或Double
的{{1}}类型类,则会找到Int
和NumberLikeDouble
。
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