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. Tensor Core技术解析(上)

    Tensor Core技术解析(上) NVIDIA在SIGGRAPH 2018上正式发布了新一代GPU架构--Turing(图灵),黄仁勋称Turing架构是自2006年CUDA GPU发明以来最大的 ...

  2. 第五周 Spring框架

    一.Spring框架设计 Spring framework 6大模块 1.1 Spring AOP AOP: 面向切面编程 Spring 早期版本的核心功能,管理对象声明周期和对象装配 为了实现管理和 ...

  3. spring IOC DI AOP MVC 事务, mybatis 源码解读

    demo https://gitee.com/easybao/aop.git spring DI运行时序 AbstractApplicationContext类的 refresh()方法 1: pre ...

  4. zookeeper分布式锁,解决了羊群效应, 真正的zookeeper 分布式锁

    zookeeper 实现分布式锁,监听前一个节点来避免羊群效应, 思路:很简单,但是实现起来要麻烦一些, 而且我也是看了很多帖子,发现很多帖子的代码,下载下来逐步调试之后发现,看起来是对的,但在并发情 ...

  5. 尚硅谷Java——宋红康笔记【day1-day5】

    day1 注释 1.java规范的三种注释方式: 单行注释 多行注释 文档注释(java特有) 2. 单行注释和多行注释的作用: ① 对所写的程序进行解释说明,增强可读性.方便自己,方便别人 ② 调试 ...

  6. [非专业翻译] 高性能对象映射框架 - Mapster

    [非专业翻译] 高性能对象映射框架 - Mapster 系列介绍 [非专业翻译] 是对没有中文文档进行翻译的系列博客,文章由机翻和译者自己理解构成,和原文相比有所有不通,但意思基本一致. 因个人能力有 ...

  7. csp-s模拟测试57(10.2)「天空龙」·「巨神兵」·「太阳神」

    题目是古埃及神话??? A. 天空龙 傻逼模拟,看来没有滑天下之大稽QAQ,也没有打错快读(大雾...) B. 巨神兵 难度爆增,一脸懵比..... 60分状压: 因为是求有向图,关于有向图好像拓扑用 ...

  8. 安装redHat6.5详细图文教程

    ​ ​ 进入VM虚拟机,双击进入已经创建好的红帽6虚拟机 双击进入CD/DVD,准备添加红帽6.5的iso镜像文件 [红帽6.5的iso镜像文件需要先下载,redhat_6.5下载地址:https:/ ...

  9. 温故而知新--day5

    温故而知新--day5 ip地址 IP是英文Internet Protocol的缩写,意思是"网络之间互连的协议",也就是为计算机网络相互连接进行通信而设计的协议.当多个设备要进行 ...

  10. .NET Core添加日志插件

    二. 首先控制器的方法中写: private readonly ILogger<fluueController> _logger; public fluueController(ILogg ...