Scala核心编程_第09章 隐式转换和隐式参数

 

我们先解释一下显式转换,例如下面:

implicit def ftoInt(d: Double): Int = {
  d.toInt
}

引出隐式转换的实际需要=>指定某些数据类型的相互转化。

隐式函数基本介绍

隐式转换函数是以implicit关键字声明的带有单个参数的函数函数将会自动应用,将值从一种类型转换为另一种类型。、

object ImplicitDemo01 {
  def main(args: Array[String]): Unit = {

    //编写一个隐式函数转成 Double->Int 转换
    //隐式函数应当在作用域才能生效
    implicit def f1(d:Double): Int = { //底层 生成 f1$1
      d.toInt
    }

    implicit def f2(f:Float): Int = {
      f.toInt
    }

    //报错:这里我们必须保证隐式函数的匹配只能是唯一的.
//    implicit def f3(f1:Float): Int = {
//      f1.toInt
//    }


    val num: Int = 3.5 // 底层编译 f1$1(3.5)
    val num2: Int = 4.5f //
    println("num:"+num.getClass+"="+ num)
    println("num2:"+num2.getClass+"="+ num2)

  }
}

 

 

 底层:

import scala.Predef.;
import scala.collection.mutable.StringBuilder;
import scala.runtime.BoxesRunTime;

public final class ImplicitDemo01$
{
  static{ new ();}
  
  public static final  MODULE$;
  private ImplicitDemo01$(){MODULE$ = this;}
  
  private final int f1$1(double d){ return (int)d; }
  
  private final int f2$1(float f){ return (int)f;}
  
  public void main(String[] args)
  {
    int num = f1$1(3.5D);
    int num2 = f2$1(4.5F);
    Predef..MODULE$.println(new StringBuilder().append("num =").append(BoxesRunTime.BoxToInteger(num)).toString());
  }
}

隐式转换的注意事项

  1. 隐式转换函数函数名可以是任意的,隐式转换与函数名称无关,只与函数签名(函数参数类型和返回值类型)有关。
  2. 隐式函数可以有多个(即:隐式函数列表),但是需要保证在当前环境下,只有一个隐式函数能被识别

案例提高

如果需要为一个增加一个方法,可以通过隐式转换来实现。(动态增加功能)比如想为MysqL增加一个delete方法

解决方

在当前程序中,如果想要给MysqL增加功能是非常简单的,但是在实际项目中,如果想要增加新的功能就会需要改变源代码,这是很难接受的。

而且违背了软件开发的OCP开发原则 (闭合原则 open close priceple) 。

在这种情况下,可以通过隐式转换函数给类动态添加功能

如果需要为一个增加一个方法,可以通过隐式转换来实现。(动态增加功能)比如想为MysqL增加一个delete方法

object ImplicitDemo02 {

  def main(args: Array[String]): Unit = {

//    //编写一个隐式函数,丰富MysqL功能
    implicit def addDelete(msql:MysqL): DB = {
      new DB
    }

    //创建MysqL对象
    val MysqL = new MysqL
    MysqL.insert()
    MysqL.delete() // 编译器工作 分析 addDelete$1(MysqL).delete()
    MysqL.update()

  }
}

class MysqL {
  def insert(): Unit = {
    println("insert")
  }
}

class DB {
  def delete(): Unit = {
    println("delete")
  }

  def update(): Unit = {
    println("update")
  }
}

  

 

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...