Scala:隐式类型转换

在笔记中[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
()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值