object l {
//隐式转换函数
// 1. 用关键字implicit 修饰
// 2. 它的函数名不重要(),重要的是它的 参数和返回值的 类型。
// 注意:不能写两个同类型(参数和返回值的类型一样)的隐式转换函数,它会报错!!!
// 它的参数名是Double,它的返回值是Int,它的作用:当代码中出现了需要把Double转换成Int的时候,系统会自动调用它
implicit def double2Int(x:Double):Int={
println("double to int ...")
x.toInt
}
//implicit def xxxx(x:Double):Int={
// println("double to int ...")
// x.toInt
// }
def main(args: Array[String]): Unit = {
//1.隐式转换
var i:Int=1;
var d:Double=1.1;
d=i//把int→double类型
//d=i.toDouble
//println(s"d=${d}")
i=d//存在一个隐式转换 把double→int 报错!!!!
i=100.1
i=100.1
}
}
在写代码的过程中,有一个原则:尽量不要修改之前的代码
隐式参数
在开发的过程中,如果预判一个参数将来会变得,就可以把它设置为implicit。
package lll
//在写代码的过程中,有一个原则:尽量不要修改之前的代码
//隐式参数
// 在开发的过程中,如果预判一个参数将来会变得,就可以把它设置为implicit。
//
object l2 {
implicit val abc:String="88888888"// 在修改隐式参数的值的时候,前面定义的变量名 不重要,类型是重要的。
def reg(name:String)(implicit password:String="123456"):Unit={
println(s"您注册成功,姓名:${name},密码:${password}")
}
// def reg(name:String,password:String="123456"):Unit={
// println(s"您注册成功,姓名:${name},密码:${password}")
// }
def main(args: Array[String]): Unit = {
reg("小花")//没有传入密码,使用默认值123456
reg("小白")("admin")
}
}
隐私转换规则
1.无歧义规则。不能重新定义两个相同的转换函数!
implicit def fun1(a:String):Int=a.toInt implicit def fun2(a:String):Int=a.toInt
implicit def fun1(a:Int):String=a.toString *
2.不能多次转换 在一次转换中,A→B,B→C。不能直接A→C 千米-→百米 百米-->米
package lll
//隐私转换规则
//1.无歧义规则。不能重新定义两个相同的转换函数!
//
/*
* implicit def fun1(a:String):Int=a.toInt
implicit def fun2(a:String):Int=a.toInt
* implicit def fun1(a:String):Int=a.toInt
implicit def fun2(a:String):Int=a.toInt
implicit def fun1(a:Int):String=a.toString
*
*2.不能多次转换
* 在一次转换中,A→B,B→C。不能直接A→C
* 千米-→百米 百米-->米
*
*
*/
object l3 {
class KM(var value:Double) {override def toString: String = s"${value}千米"}
class BM(var value:Double) {override def toString: String = s"${value}百米"}
class M(var value:Double) {override def toString:String=s"${value}米"}
implicit def km2bm(km: KM):BM=new BM(km.value*10)
implicit def bm2m(bm:BM): M=new M(bm.value*100)
//_________________________________________________
def main(args: Array[String]): Unit = {
val km=new KM(1.1)
val bm:BM=km
println(km)
println(bm)
}
}