Scala中的隐式转换函数、隐式参数和隐式类

隐式转换函数: 所谓隐式转换函数指的是implicit关键字修饰的且只有一个参数的函数,其作用是 1.隐式转换增强现有类型,2. 隐式转换做参数类型转换​​​​​​​
1. 例如:

inplicit def int2String(n:Int):String = (n.toString)

上案例:我们把Fruit对象转换成了Monkey对象

//Scala的隐式转换

//水果
class Fruit(name:String){
  def getFruitName():String = {name}
}

//猴子Monkey
class Monkey(f:Fruit){
  def say() = {println("Monkey like " + f.getFruitName())}
}

object ImplicitDemo {
  implicit  def fruitToMonkey(f:Fruit):Monkey = {new Monkey(f)}

  def main(args: Array[String]) {
    //创建一个Fruit的对象
    var f:Fruit = new Fruit("香蕉")
    //问题:能否调用f.say() 方法呢?解决方法:将Fruit的对象转换为Monkey的对象
    f.say()
  }
}

2. 隐式转换做参数类型转换

  // 案例:特殊售票窗口(只接受特殊人群,比如学生、老人等)
  class SpecialPerson(val name : String)
  class Student(val name : String)
  class Older(val name : String)
  
  //隐式转换函数,将Student和Older转变成SpecialPerson类型
  implicit def object2SpecialPerson(obj : Object) : SpecialPerson = {
    obj match{
      case a : Student => {val stu = obj.asInstanceOf[Student];new SpecialPerson(stu.name)}
      case b : Older =>{val old = obj.asInstanceOf[Older];new SpecialPerson(old.name)}
      case _ => Nil
    }
  }
  
  def buySpecialTicket(sp : SpecialPerson){
    println("buySpecialTicket success " + sp.name)
  }
  buySpecialTicket(new Student("Student"))

运行结果:

 

隐式参数:使用implicit申明的函数参数叫做隐式参数。我们也可以使用隐式参数实现隐式的转换

//Scala的隐式参数
def testParam(implicit name:String) = {println("The value is " + name)}

//定义一个隐式参数
implicit val name:String="这是一个隐式值"

//问题:在调用的方法的时候,可以不用传递参数吗?
testParam

//使用隐式参数实现隐式的转换
//定义一个方法,找到两个值中较小的那个值
//   100   23  ---> 23
//   Hello  ABC ---> ABC
def smaller[T](a:T,b:T)(implicit order:T => Ordered[T]) = if(a < b) a else b
smaller(100,23)
smaller("Hello","ABC")

所谓隐式类: 就是对类增加implicit 限定的类,其作用主要是对类的功能加强!

/**
  * Scala的隐式类
  */
object ImplicitClass {

  //隐式类
  implicit class Calc(x:Int){
    def add(a:Int):Int = a + x
  }

  def main(args: Array[String]) {
    println("两个数字的和:" + 1.add(2))
  }
  /*
隐式类执行的过程:
1. 当1.add(2),scala的编译器不会立即报错;在当前域当中查找,有没有implicit修饰的,同时可以将Int作为参数的构造器,
并且具有add方法的类。通过查找,找到了Calc
2. 利用隐式类Calc来执行add方法
*/
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值