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方法
}
Scala学习——隐式转换的更多相关文章
- scala自定义隐式转换
Scala自定义隐式转换 一.编写隐式转换类 /** * Author Mr. Guo * Create 2019/4/20 - 17:40 */ object StringImprovments { ...
- Scala学习之路 (八)Scala的隐式转换和隐式参数
一.概念 Scala 2.10引入了一种叫做隐式类的新特性.隐式类指的是用implicit关键字修饰的类.在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换. 隐式转换和隐式参数是Scal ...
- scala的隐式转换学习总结(详细)
一,隐式转换函数 1, 格式, implicit def 函数名(参数):返回值类型={ //函数体 //返回值 } 2,例子: //导入对应的规则类,以免出现警告 scala> import ...
- 深入理解Scala的隐式转换系统
摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1. ...
- Scala模式匹配| 隐式转换
1. 模式匹配 Scala中的模式匹配类似于Java中的switch语法,但是更加强大.模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分 ...
- 转载:深入理解Scala的隐式转换系统
摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1. ...
- Scala之隐式转换
概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型. 隐式转换有四种常见的使用场景: 将某一类 ...
- Scala之隐式转换implicit详解
假设我们有一个表示文本的行数的类LineNumber: class LineNumber ( val num : Int ) 我们可以用这个类来表示一本书中每一页的行数: val lineNumOfP ...
- 深入理解Scala的隐式转换
摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1. ...
随机推荐
- YOLO v1到YOLO v4(上)
YOLO v1到YOLO v4(上) 一. YOLO v1 这是继RCNN,fast-RCNN和faster-RCNN之后,rbg(RossGirshick)针对DL目标检测速度问题提出的另外一种框 ...
- HarmonyOS系统概述
HarmonyOS系统概述 系统定位 HarmonyOS是一款"面向未来".面向全场景(移动办公.运动健康.社交通信.媒体娱乐等)的分布式操作系统.在传统的单设备系统能力的基础上, ...
- Seata分布式事务框架Sample
前言 阿里官方给出了seata-sample地址,官方自己也对Sample提供了很多类型,可以查看学习. 我这里选择演示SpringBoot+MyBatis. 该聚合工程共包括5个module: sb ...
- 解决:ImportError: DLL load failed while importing _sqlite3: 找不到指定的模块。
Django框架学习第一步,创建一个Django工程. 本次采用的是创建虚拟环境来创建Django工程.本地解释器采用anaconda ,内置Python3.8 在pycharm中报错: 内容如下:I ...
- 阿里云视频云 Retina 多媒体 AI 体验馆开张啦!
带你体验视频更多可能 海量视频管理难度大?翻库检索特定人物费时费力?视频内容剪辑效率低?您的得力助手"Retina多媒体AI"体验馆已上线.带你感受视频AI黑科技,开启极致智能体验 ...
- 面试官:如何在分布式场景下生成全局唯一 ID?
在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或者用作事务版本号.分布式链路追踪等等,好的全局唯 ...
- EasyExcel随笔
EasyExcel 注意点 不支持的功能 单个文件的并发写入.读取 读取图片 宏 csv读取 出现 NoSuchMethodException, ClassNotFoundException, NoC ...
- 开箱即用的微服务框架 Go-zero(进阶篇)
之前我们简单介绍过 Go-zero 详见<Go-zero:开箱即用的微服务框架>.这次我们从动手实现一个 Blog 项目的用户模块出发,详细讲述 Go-zero 的使用. 特别说明本文涉及 ...
- Unity3D学习笔记1——绘制一个三角形
目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无奈发 ...
- Kubernetes的资源管理
本节讲解为一个pod配置资源的预期使用量和最大使用量.通过设置这两组参数,可以确保pod公平地使用Kubernetes集群资源,同时也影响着整个集群pod的调度方式. 1.为pod中的容器申请资源 创 ...