• Scala学习——隐式转换


    scala隐式转换

    一、需求:为一个类添加一个新的方法

    java:动态代理

    scala:隐式转换

    隐式转换例子:

    1、man to superMan

    package top.ruandb.scala.Course07
     
    object ImplicitApp {
     
      def main(args: Array[String]): Unit = {
        //定义隐式转换函数,用于将man成superMan
        implicit def man2superman(man:Man):SuperMan=new SuperMan(man.name);
        //实例化一个man
        val man = new Man("rdb")
        //返回的是一个超人
        man.fly()
        //t同时它也是一个人
        man.eat("马铃薯")
      }
    }
    class Man(val name:String){
      def eat(food:String): Unit ={
        println(s"${name} 正在吃 ${food}")
      }
    }
    class SuperMan(val name:String){
      def fly(): Unit ={
        println(s"${name} is fly ......")
      }
    }

    2、java IO中File类是没有read方法的,我们可以通过隐式转换添加read方法

    package top.ruandb.scala.Course07
    import java.io.File
    object ImplicitApp {
     
      def main(args: Array[String]): Unit = {
     
        //定义隐式转换函数
        implicit  def file2richfile(file:File) :RichFile = new RichFile(file);
        val file = new File("D:\test\a.txt")
        //位File类增加了read方法
        val txt = file.read()
        println(txt)
      }
    }
    class RichFile(val file:File){
      def read(): String ={
        scala.io.Source.fromFile(file.getPath).mkString
      }
    }

    二、隐式转换切面封装

    上面两个小例子中隐式转换函数和业务代码放一起了,正式情况下应该统一封装到一个切面中

    package top.ruandb.scala.Course07
     
    import java.io.File
    //将切面引入
    import top.ruandb.scala.Course07.ImplicitAspect._
     
    object ImplicitApp {
     
      def main(args: Array[String]): Unit = {
     
        //实例化一个man
        val man = new Man("rdb")
        //返回的是一个超人
        man.fly()
     
        //也可以用的使用引入,用哪个引入哪个
        //import top.ruandb.scala.Course07.ImplicitAspect.file2richfile
        val file = new File("D:\test\a.txt")
        //位File类增加了read方法
        val txt = file.read()
        println(txt)
     
     
      }
    }
    class RichFile(val file:File){
      def read(): String ={
        scala.io.Source.fromFile(file.getPath).mkString
      }
    }
    class Man(val name:String){
      def eat(food:String): Unit ={
        println(s"${name} 正在吃 ${food}")
      }
    }
     
    class SuperMan(val name:String){
      def fly(): Unit ={
        println(s"${name} is fly ......")
      }
    }
    package top.ruandb.scala.Course07
     
    import java.io.File
     
    object ImplicitAspect {
     
      //定义隐式转换函数
      implicit  def file2richfile(file:File) :RichFile = new RichFile(file);
     
      //定义隐式转换函数,用于将man成superMan
      implicit def man2superman(man:Man):SuperMan=new SuperMan(man.name);
    }

    三、隐式参数

    指的是在函数或者方法中,定义一个implicit修饰的参数,此时scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数

    package top.ruandb.scala.Course07
     
    import java.io.File
    //将切面引入
    import top.ruandb.scala.Course07.ImplicitAspect._
     
    object ImplicitApp {
     
      def main(args: Array[String]): Unit = {
    //    testParam//会报错,找不到隐式参数
     
    //    testParam("lis")//会把lisi String当成隐式参数
     
    //    implicit val name = "lucy"
    //    testParam //会自动找到name 作为隐式参数
     
    //    implicit val s1 = "lucy"
    //    implicit val s2 = "lisi"
    //    testParam //报错,不知道用 s1 还是 s2
         
      }
     
      def testParam(implicit name:String): Unit ={
        println(name)
      }
    }

    三、隐式类

    对类增加implicit限定的类,主要作用是对类的加强

    package top.ruandb.scala.Course07
     
    object ImplicitClassApp extends App {
     
      //隐式类传进来是Int,会发现所有的Int都包含add方法
      implicit class Calculator(x:Int){
        def add(a:Int): Int = a + x
      }
     
      println(12.add(3)) //默认情况下Int类里没有add方法
    }
  • 相关阅读:
    612.1.004 ALGS4 | Elementary Sorts
    612.1.003 ALGS4 | Stacks and Queues
    612.1.002 ALGS4 | Analysis of Algorithms
    132.1.001 Union-Find | 并查集
    如何优雅使用Coursera ? —— Coursera 视频缓冲 & 字幕遮挡
    Jupyter notebook 使用多个Conda 环境
    如何从 GitHub 上下载单个文件夹
    在jupyter notebook中同时安装python2和python3
    修改ps工具栏字体大小
    python之集合
  • 原文地址:https://www.cnblogs.com/jnba/p/10677616.html
Copyright © 2020-2023  润新知