Implict Classes
本文简单介绍了scala2.10的新特性,隐式类。你只需要在合适的类前面加上implict关键字,即可使得在该隐式类作用域内,可以在该类的主构造器内完成一些隐式转换。
用法
创建一个隐式类,只需要在合适的类前面加上implict关键字,例如:
object Helpers {
implicit class IntWithTimes(x: Int) {
def times[A](f: => A): Unit = {
def loop(current: Int): Unit =
if(current > 0) {
f
loop(current - 1)
}
loop(x)
}
}
}
这个例子创建了一个隐式类 IntWithTimes,该类包含了一个整型的参数值和一个新方法times.如果需要使用该类,只需将其导入到作用域,并调用times.
scala> import Helpers._
import Helpers._
scala> 5 times println("HI")
HI
HI
HI
HI
HI
想要隐式类能正常使用,它的名称必须定义正确并且清晰,就像其它的隐含值或隐式转换。
注意:
隐式类必须注意以下规则:
1 . 它们必须定义在其它的trait/class/object内.例如:
object Helpers {
implicit class RichInt(x: Int) // OK!
}
implicit class RichDouble(x: Double) // BAD!
2 . 在它们的构造器中,可能只允许一个非隐式参数,例如:
implicit class RichDate(date: java.util.Date) // OK!
implicit class Indexer[T](collecton: Seq[T], index: Int) // BAD!
implicit class Indexer[T](collecton: Seq[T])(implicit index: Index) // OK!
也可能你能够使用一个以上的非隐式参数,但这可能会导致隐式转换失效。
3 . 任何的方法,变量或常量或者伴生对象在作用范围内都不能和隐式类的名字相同。例如:
Note: This means an implicit class cannot be a case class.
object Bar
implicit class Bar(x: Int) // BAD!
val x = 5
implicit class x(y: Int) // BAD!
implicit case class Baz(x: Int) // BAD!