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. ...
随机推荐
- CUDA运行时 Runtime(四)
CUDA运行时 Runtime(四) 一. 图 图为CUDA中的工作提交提供了一种新的模型.图是一系列操作,如内核启动,由依赖项连接,依赖项与执行分开定义.这允许定义一次图形,然后重复启动.将 ...
- GPU上创建目标检测Pipeline管道
GPU上创建目标检测Pipeline管道 Creating an Object Detection Pipeline for GPUs 今年3月早些时候,展示了retinanet示例,这是一个开源示例 ...
- 5G和AI机器人平台
5G和AI机器人平台 Qualcomm Launches 5G and AI Robotics Platform 高通技术公司(Qualcomm Technologies)周三推出了一款高级5G和人工 ...
- 前台JS遍历Table的所有单元格数据内容
在日常开发过程中为了减少与后台服务器的交互次数,大部分的功能都会放到前台使用JS来完成. 例如:一个表中有ID(FOCUS_SEQ)和Name(COLUMNCTRL)两个字段,其中ID是自定义连续增长 ...
- 《python网络数据采集》笔记2
1.网页表单与登陆窗口 Requests 库擅长处理那些复杂的 HTTP 请求.cookie.header(响应头和请求头)等内容. 1)表单提交 import requests #字段 params ...
- .NET平台系列30:.NET Core/.NET 学习资源汇总
系列目录 [已更新最新开发文章,点击查看详细] .NET Core/.NET技术虽然吸取了.NET Framework 中的精华,但是也扩展了一些新功能,尤其是跨平台的 ASP.NET Cor ...
- Go语言实现的23种设计模式之结构型模式
摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...
- 【题解】SOFTWARE 二分+搜索/dp
题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用的天数是 ...
- golang 用defer 捕获error 需小心
有时一个函数内需要根据最后是否出错,决定是否执行某个操作.这时候如果函数的分支又比较多,就会比较麻烦了. defer 处理这个情况刚好合适 func main() { var err error by ...
- GitHub Desktop的使用,创建项目、上传文件,设置忽略文件
下载登陆之后 新建项目File--第一个New repository 然后输入项目名称,选择项目文件夹,最后点Creata repository创建项目 这只是在本地建了项目. 项目文件夹中有其他文件 ...