scala 隐式类

来源:互联网 发布:肯尼迪双柱 做丝数据 编辑:程序博客网 时间:2024/06/04 20:08

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 Barimplicit class Bar(x: Int) // BAD!val x = 5implicit class x(y: Int) // BAD!implicit case class Baz(x: Int) // BAD!

0 0
原创粉丝点击