【Scala】10、隐式类型转换

隐式值和隐式参数

package com.yxx

/*
*
*   隐式值和隐式参数 {
*       1、单个参数的情况下 将参数指定为隐式类型 那么系统会在作用域之内自动查找对应类型的隐式类型的变量 可以不传参数调用方法
*       2、多个参数的情况下 必须使用柯里化函数 将隐式类型的参数单独提出来 不能和普通的参数放一起
*       3、同一个作用域之内 只能有一个类型的隐式类型的值,不然编译器不知道隐式类型的参数选择哪一个值
*   }
* */
object Test_Implicit {
  // 普通的带有一个参数的函数
  def say(implicit  name:String): Unit ={
    println(s"$name is saying...")
  }
  //带有一个参数的柯里化函数
  def say1(age:Int)(implicit  name:String): Unit ={
    println(s"$name is saying ,$name 已经 $age 岁了")
  }

  def main(args: Array[String]): Unit = {
    implicit val name:String ="alalal"
    //使用隐式参数和不使用隐式参数
    say
    say("alalal")
    //使用隐式参数 和不使用隐式参数
    say1(10)
    say1(100)("kakakka")
  }
}

隐式转换函数

package com.yxx

/*
*  1、隐式转换函数使用implicit修饰
*  2、当scala运行的时候 假设A类型调用了方法method,而A类型没有方法method 但是B类型有这个方法
*   3、那么此时 scala就会在作用域内找隐式类型转换的函数将A类型转换为B类型 若是有的话 A类型就可以调用B类型的method方法
*  4、注:隐式转换函数只与参数和返回值类型有关 所以作用域之内不能有相同的参数类型和返回值类型的不同名称的隐式转换函数
* */
case class Fish(name:String){
  def swim(): Unit ={
    println(s"$name is swimming...")
  }
}
case class Rabbit(name:String){

}

object Test_Implicit2 {
  implicit def lslls(rabbit:Rabbit):Fish={
    Fish(rabbit.name)
  }
  def main(args: Array[String]): Unit = {
    val rabbit =Rabbit("lall")
    rabbit.swim
  }

}

隐式类

package com.yxx

/*
*   1、使用implicit修饰的类就是隐式类
*   2、若一个变量A没有某些方法或者某些变量时,而这个变量调用某些方法和某些变量时,可以定义一个隐式类,隐式类中定义了这些方法和变量,隐式类中传入A即可
*   3、注意:隐式类必须定义在类、包对象、伴生对象中
*           隐式类的构造必须只有一个参数,同一个类,包队形、伴生对象中不能出现同类型构造的隐式类
* */
case class Rabbit444(name:String)
object Test_Implicit3 {
  implicit class A(r:Rabbit444){
    def say(): Unit ={
      println(s"${r.name} is saying...")
    }
  }
  def main(args: Array[String]): Unit = {
    val r =Rabbit444("lalallalal")
    r.say()
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值