`
mwei
  • 浏览: 124181 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

Scala:隐式类型转换

阅读更多
在笔记中 2 days ago 使用过隐式类型转换,这个功能很迷幻、很强大。
继续做个练习,回顾一下:
object IntArray2Int2 {
  val x=Array(1,2,3)
  //println(x+2) //Array的+这个方法参数为String类型,所以报错  
  val y=Array(4,5,6)
  //println((x+y)) //同样报错,原因同上
  
  println(x+"ABC") //[I@defa1aABC 每次运行结果不一
}

object IntArray2Int {
  import ImplicitHelper.intarray2sum //可以这么导入隐式转换函数
  //implicit def intarray2sum(ia:Array[Int]):Int=ia.reduceLeft(_+_) //或者使用直接声明的方式
  
  def main(args:Array[String]):Unit={
    val x=Array(1,2,3)  
    val y=Array(4,5,6)   
    
    println((x+y)) //21
//编译器试图在执行的上下文里找一个隐式函数,能够把Array对象转换成带有+方法的目标对象,预定义的隐式函数没有这个功能,自定义的intarray2sum可以,成功;

//执行的上下文:调用方法(main)所在的作用域(IntArray2Int、全局导入及局部导入);
  }
}

object ImplicitHelper{
  implicit def intarray2sum(ia:Array[Int]):Int=ia.reduceLeft(_+_) 
}

下面再来一个练习:
class TestImplicit(val i:Int){  
  def +(t:TestImplicit)=println("+ an object..."+t.i)
  def ~(t:TestImplicit)=println("~ an object..."+t.i)  
}

object TestImplicit {
  //前提:提供隐士转换函数,可以对参数和调用者(receiver)转换
  //去掉int2Obj或者obj2Int,程序都不会报错,只是下面的转换形式稍有差异(略)
  implicit def int2Obj(i:Int)=new TestImplicit(i)
  implicit def obj2Int(o:TestImplicit)=o.i
  
  implicit def double2Obj(d:Double)=new TestImplicit(d.toInt)
  
  def main(args: Array[String]): Unit = {  
    val obj=new TestImplicit(3)
    println(1+obj)//1和obj都有+方法,编译器尝试的是对参数转换
    println(obj+1)//同上
    println("----------cutting1-------------")
    println(1~obj)//1没有~方法,对调用者(receiver)转换,即把1转换成目标对象
    println(obj~1)//obj有~方法,对参数转换
    println("----------cutting2-------------")
	val d1:Double=1.0
    val d2:Double=2.0
    println(d1~d2)//d1与d2都没有~方法,对参数和调用者(receiver)同时转换
  }
}
//-------console--------------------------------------->
4
+ an object...1
()//println的返回值
----------cutting1-------------
~ an object...3
()
~ an object...1
()
----------cutting2-------------
~ an object...2
()

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics