什么是隐式转换
隐式转换是指:scala自动把一种类型转成另一种类型的过程。这个过程对用户编程而言不可见,不需要用户手动编写代码。
object imp01 {
//隐式 偷偷地......
implicit def double2Int(d:Double):Int={
println("double2Int被调用了......")
d.toInt
}
def main(args: Array[String]): Unit = {
//不能把Double类型保存到Int。这样会有精度损失,不会自动做转换。
var i:Int = 1.1 :Double
//可以把int类型保存到Double,会自动转换
var d:Double = 1
}
}
object imp02 {
class KM(var value:Double) {
override def toString:String = s"${value}千米"
}
class M(var value:Double) {
override def toString:String = s"${value}米"
}
implicit def km2m(km:KM):M={
new M(1000*km.value)
}
def main(args: Array[String]): Unit = {
val km1=new KM(1)
val m1:M=km1
println(km1)
println(m1)
}
}
#### 转换规则
隐式转换确实非常的强大,但是,在具体的使用过程中,我们要遵循一些特定的转换规则。
具体来说有两点:无歧义规则,不能多次转换。下面我们分别来解释
规则1:无歧义规则:不能重新定义两个相同的转换函数。如果有两个隐式转换函数,只有函数名不同,则会导致错误。
规则2:不能多次转换:在一次转换过程中可以把A->B,B->C,但是不能直接从A->C。
object imp03 {
//1美元=6.9人民币
//1人民币=0.14美元
class MY(var value:Double) {
override def toString:String = s"${value}美元"
}
class RMB(var value:Double) {
override def toString:String = s"${value}人民币"
}
implicit def my2rmb(my:MY):RMB={
new RMB(6.9*my.value)
}
implicit def rmb2my(rmb:RMB):MY={
new MY(0.14*rmb.value)
}
def main(args: Array[String]): Unit = {
val m1:RMB = new MY(100)
println(m1)
val my1:MY=new RMB(1000)
println(my1)
}
}