scala(7)隐式转换 隐式变量 隐式类

Scala提供的隐式转换特性可以在效果上给一个类增加一些方法,或者用于接收不同类型的对象.

implicit关键字只能用来修饰方法、变量(参数)和伴随对象。
隐式转换的方法(变量和伴随对象)在当前范围内才有效。如果隐式转换不在当前范围内定义(比如定义在另一个类中或包含在某个对象中),那么必须通过import语句将其导。举例

package demo {
package util {

import java.util.Date
import java.text.SimpleDateFormat

object DateUtil {
   
  class DateWrapper(date: Date) {
   
    def format(str: String) = new SimpleDateFormat(str).format(date)
  }
  implicit def toDateWrapper(date: Date) = new DateWrapper(date)
}
}

package service {
import java.text.SimpleDateFormat
import java.util.Date
   // 注: 必须将object Rest的定义放在class Rest之前,或者显式指出str2Date的返回类型,否则编译不通过
   object Rest{
   
    class RichDate(str: String){
   
      def toDate(): Date = new SimpleDateFormat("yyyy-MM-dd").parse(str)
    }
    implicit def str2Date(str: String) = new RichDate(str)
  }
  class Rest {
   
     import util.DateUtil._
     import Rest._
      // 必须把demo.util包下的伴随对象DateWrapper中的所有成员引进来
     def today = new Date().format("yyyy-MM-dd");
     // 伴随对象 Rest中定义了一个隐式转换函数
     def getDate(str: String): Date = str.toDate();
  }

}

object SC4 {
   
  import demo.service.Rest
   def main(args: Array[String]) ={
     println (new Rest().today)
     println(new Rest().getDate("2011-01-09"))
   }
}
}

但有一种情况例外,源类型或目标类型(包括源类型和目标类型的类型变量的类型)的伴随对象中隐式转换函数(或变量,伴随对象)不需要显示导入。 比如

package demo{
object MyTestApp{
   
  def main(args: Array[String]): Unit = {
    val myTest = new MyTest();
    myTest.printInt(4)
    myTest.printYourTest(myTest)  // the source type is of MyTest while the target require YourTest
    myTest.fuxkTest()  //  there is no method on MyTest but we can still call it 
  }
}

class YourTest{
   
  override def toString = "Your Test"
   def  fuxkTest() = print("fuxk Test");
}

 object YourTest{
   
    implicit def myTest2YourTest = new YourTest
 }

class MyTest{
   
  import MyTest._
  def printStr(str: String) = println(str)

   // you can't do it like `printStr(i)` unless you bring the implicit converter `MyTest.int2String`into scope
  def printInt(i: Int) = printStr(i)

  def printYourTest(obj: YourTest) = println(obj)

  def getYorTest(): YourTest = this;
}

object  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值