scala隐式转换

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

java:动态代理

scala:隐式转换

隐式转换例子:

1、man to superMan

package top.ruandb.scala.Course07object ImplicitApp {def main(args: Array[String]): Unit = {//定义隐式转换函数,用于将man成superManimplicit def man2superman(man:Man):SuperMan=new SuperMan(man.name);//实例化一个manval 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.Course07import java.io.File
//将切面引入
import top.ruandb.scala.Course07.ImplicitAspect._object ImplicitApp {def main(args: Array[String]): Unit = {//实例化一个manval man = new Man("rdb")//返回的是一个超人
    man.fly()//也可以用的使用引入,用哪个引入哪个//import top.ruandb.scala.Course07.ImplicitAspect.file2richfileval 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.Course07import java.io.Fileobject ImplicitAspect {//定义隐式转换函数implicit  def file2richfile(file:File) :RichFile = new RichFile(file);//定义隐式转换函数,用于将man成superManimplicit def man2superman(man:Man):SuperMan=new SuperMan(man.name);
}

三、隐式参数

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

package top.ruandb.scala.Course07import 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.Course07object ImplicitClassApp extends App {//隐式类传进来是Int,会发现所有的Int都包含add方法implicit class Calculator(x:Int){def add(a:Int): Int = a + x}println(12.add(3)) //默认情况下Int类里没有add方法
}

转载于:https://www.cnblogs.com/jnba/p/10677616.html

Scala学习——隐式转换相关推荐

  1. 深入理解Scala的隐式转换系统

    原文链接:http://www.cnblogs.com/MOBIN/p/5351900.html ---------------------------------------------- 摘要: ...

  2. 深入理解Scala的隐式转换

    摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1.将方 ...

  3. 大数据Saprk----Spark基础-scala的隐式转换

    first Codec **public class Friend {public static void main(String[] args){System.out.println("B ...

  4. scala之隐式转换

    目录 0.隐式转换定义 1.函数隐式转换 2.使用隐式转换加强现有类型 3.隐式转换函数的作用域与导入 4.隐式参数 5.隐式转换的发生时机 0.隐式转换定义 实现方式:隐式转换函数接收的参数类型定义 ...

  5. Scala的隐式转换详解

    隐式转换是在Scala编译器进行类型匹配时,如果找不到合适的类型,那么隐式转换会让编译器在作用范围内自动推导出来合适的类型. 1.隐式值与隐式参数 隐式值是指在定义参数时前面加上implicit.隐式 ...

  6. Scala自动隐式转换

    底层实现:Scala编译器自动调用了transform方法将5.0转换成Int 在相同作用域内,不能含有多个相同类型的转换规则

  7. scala学习之旅(十三):隐式转换和隐式参数

    文章地址:http://www.haha174.top/admin/article/list 1.引言 scala 提供的隐式转换和隐式参数功能,是非常有特色的功能.是java 等编程语言所没有的功能 ...

  8. Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...

    Scala高级特性 1.    学习目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  9. Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)

    object func {def main(args:Array[String]):Unit={//函数赋值给变量时, 必须在函数后面加上空格和下划线.def sayHello(name: Strin ...

  10. 【Scala】Scala中的模式匹配、类型参数与隐式转换

    1.模式匹配 (1)概述 模式匹配是Scala中非常有特色,非常强大的一种功能.模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理.但 ...

最新文章

  1. 数据挖掘之离群点检测
  2. CF464E-The Classic Problem【最短路,主席树】
  3. java contenttype_POST不同提交方式对应的Content-Type,及java服务器接收参数方式
  4. 看完就入门系列!吞吐量、消息持久化、负载均衡和持久化、伸缩性…… 你真的了解 Kafka 了吗?...
  5. JS中的location.href
  6. 怎么安装ABBYY FineReader
  7. 微信小程序 服务器触发事件,微信小程序组件间通讯与事件
  8. AD采样的平均值滤波
  9. 杭电2149Public Sale
  10. 排列组合算法之二: 01转换法_java改变后的c++改进版
  11. C#窗体无法接受Keydown事件
  12. 构建之法:第八次心得
  13. 软件测试面试之智力题
  14. 6个usb口服务器无响应,USB接口不能用(没反应)修复方法
  15. 邮箱地址是什么,163vip.com怎么注册、价格、申请入口、功能!
  16. 史上五大最光明的白帽黑客介绍 都有很大技术贡献
  17. SVG 绘制可交互的中国地图
  18. 手机怎么识别图片上的文字
  19. DropdownMenu 下拉菜单的使用
  20. Survey of Aspect-based Sentiment Analysis Datasets

热门文章

  1. SQL读书笔记SQL操作语句
  2. mice包--R中数据缺失值的处理
  3. 【洛谷P4706】取石子
  4. iOS----------APP怎样做更安全
  5. 【工具】Sublime Text 自动保存功能
  6. Motion camera 真人动作捕捉器
  7. 搭建Cocos2d-js开发环境(Window)
  8. 【Java基础】图片压缩
  9. 字符串lcfirst解析
  10. Direct3D光与材质的颜色值