Scala的implicit隐式转换

Posted on 2009-12-23 17:17 xsong 阅读(4139) 评论(0)  编辑  收藏 所属分类: scala

java 有很庞大的类库资源,但是 被声明成 final 的类不允许继承 例如 String , 怎样扩展java及第三方类库 scala提供了很灵活的方式

当 scala 使用 implicit 隐式转化时 ,  scala 编辑器发现对象的类型不匹配时,不会直接报错,而会在代码中尝试匹配implicit声明的object, 当然,相同方法签名的类必须唯一。
举个小例子,实现在字符串前后 添加 "**" 的操作。

当然 例子本事无实际意义, 只是说明implicit的用法而已 
 1object implicits {
 2
 3  implicit  def strWrapper(s : String)={
 4    new {
 5      def wrap= "**"+s+"**"
 6    }

 7  }

 8  def main(args: Array[String]) {
 9    val s = "hello"
10    println(s.wrap)  // **hello**
11  }

12}

当scala的编译器 编译 s.wrap 时,因为 String 类中没有 wrap方法,编译器会寻找代码中方法签名相同的 strWrapper(s :String),
输出  **hello**

另外一种写法 :

 1object implicits {
 2
 3  class StrWrapper(s : String){
 4    def wrap="**"+s+"**"
 5  }

 6  def main(args: Array[String]) {
 7    implicit def wrapper(s :String)=new StrWrapper(s)
 8    val s = "hello" 
 9    println(s.wrap) // print **hello**
10  }

11}

只有注册用户登录后才能发表评论。


网站导航: