在笔记中[url=http://mwei.iteye.com/admin/blogs/840153] 2 days ago [/url]使用过隐式类型转换,这个功能很迷幻、很强大。
继续做个练习,回顾一下:
下面再来一个练习:
继续做个练习,回顾一下:
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
()