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方法
}

Scala学习——隐式转换的更多相关文章

  1. scala自定义隐式转换

    Scala自定义隐式转换 一.编写隐式转换类 /** * Author Mr. Guo * Create 2019/4/20 - 17:40 */ object StringImprovments { ...

  2. Scala学习之路 (八)Scala的隐式转换和隐式参数

    一.概念 Scala 2.10引入了一种叫做隐式类的新特性.隐式类指的是用implicit关键字修饰的类.在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换. 隐式转换和隐式参数是Scal ...

  3. scala的隐式转换学习总结(详细)

    一,隐式转换函数 1, 格式, implicit def 函数名(参数):返回值类型={ //函数体 //返回值 } 2,例子: //导入对应的规则类,以免出现警告 scala> import ...

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

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

  5. Scala模式匹配| 隐式转换

    1. 模式匹配 Scala中的模式匹配类似于Java中的switch语法,但是更加强大.模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分 ...

  6. 转载:深入理解Scala的隐式转换系统

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

  7. Scala之隐式转换

    概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型. 隐式转换有四种常见的使用场景: 将某一类 ...

  8. Scala之隐式转换implicit详解

    假设我们有一个表示文本的行数的类LineNumber: class LineNumber ( val num : Int ) 我们可以用这个类来表示一本书中每一页的行数: val lineNumOfP ...

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

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

随机推荐

  1. YOLO v4分析

    YOLO v4分析 YOLO v4 的作者共有三位:Alexey Bochkovskiy.Chien-Yao Wang 和 Hong-Yuan Mark Liao.其中一作 Alexey Bochko ...

  2. RCNN系列、Fast-RCNN、Faster-RCNN、R-FCN检测模型对比

    RCNN系列.Fast-RCNN.Faster-RCNN.R-FCN检测模型对比 一.RCNN 问题一:速度 经典的目标检测算法使用滑动窗法依次判断所有可能的区域.本文则预先提取一系列较可能是物体的候 ...

  3. L4自动驾驶技术

    L4自动驾驶技术 一.SAE的五个级别分别是: L0:驾驶员完全掌控车辆,无任何自动化能力. L1:自动系统有时能够辅助驾驶员完成某些驾驶任务.比如高速自动巡航(自动认知所在车道),和一些驾驶辅助功能 ...

  4. ffmpeg architecture(上)

    ffmpeg architecture(上) 目录 介绍 视频-您看到的是什么! 音频-您在听什么! 编解码器-缩小数据 容器-音频和视频的舒适场所 FFmpeg-命令行 FFmpeg命令行工具101 ...

  5. Python爬虫入门:Urllib parse库使用详解(二)

    文字转载:https://www.jianshu.com/p/e4a9e64082ef,转载内容仅供学习 如有侵权,请联系删除 获取url参数 urlparse 和 parse_qs ParseRes ...

  6. jmeter设置成中文显示

    meter默认语言设置: 1.临时设置: 进入options -- Choose Language -- 选择中文简体,设置后语言切换成中文,重启失效 2.永久设置:进入jmeter目录下的bin目录 ...

  7. 137. 只出现一次的数字 II

    2021-04-30 LeetCode每日一题 链接:https://leetcode-cn.com/problems/single-number-ii/ 方法1:使用map记录每个数出现的次数,再找 ...

  8. mybatis自定义打印执行时间并格式化sql插件

    打印SQL的执行时间,我们可以实现mybatis官方我们提供的接口org.apache.ibatis.plugin.Interceptor,我们可以拦截的类有多个Executor,StatementH ...

  9. HTTP请求方法及响应状态码详解

    HTTP请求方法和响应状态详解 HTTP请求方法 HTTP1.0/1.1支持的所有请求方法如下所示: GET 用来请求访问已被URI识别的资源.指定的资源经服务器解析后返回响应内容. POST POS ...

  10. android动画系列

    Android 属性动画(Property Animation) 完全解析 (上 动画系列 - 传统View动画与Property动画基础及比较 [Android 基础]Animation 动画介绍和 ...