隐式转换函数

28 阅读1分钟
//隐式转换函数
//1.用关键字implicit修饰
//2.它的函数名不重要(一般的命名是类型1To类型2),重要的是它的参数和返回值的类型
//3.系统会自动调用它
//注意:不能写两个同类型(参数和返回值类型都一样)的隐式转换函数,它会报错!

implicit def doubleToInt(x:Double):Int={
  println("double to nt ...")
  x.toInt
}

def main(args: Array[String]): Unit = {
  var i:Int=1;
  var d:Double=1.1;
  d=i//把int → doule类型
  //d=i.toDouble
  //println(s"d=${d}")
  i=d//存在一个隐式转换,把double → int 报错
  i=100.1
  i=100.1
}
implicit val defaultPassword:String="88888888"
def reg(name:String)(implicit password:String="123456"):Unit={
  println(s"您注册成功,姓名:${name},密码:${password}")}

  def main(args: Array[String]): Unit = {
    reg("小花")
    reg("小白")("admin")
  }
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)
implicit def xxxx(km:KM):M=new M(km.value*1000)

def main(args: Array[String]): Unit = {
  val km=new KM(1.1)
  val bm:BM=km
  println(km)
  println(bm)

  val m:M=bm
  println(m)

  val m1:M=new KM(2)
  println(m1)
class User {
  def insertUser():Unit={
    println("添加一个新用户...")
  }
}
class UserExt {
  def updateUser():Unit={
    println("修改用户.......")
  }
}
implicit def XXX(user:User):UserExt={
  new UserExt
}


def main(args: Array[String]): Unit = {
  val u1 =new User()
  u1.insertUser()
  u1.updateUser()