scala 隐式转换与隐式参数
隐式转换函数
指的是以implicit关键字声明的带有单个参数的函数,这种函数会自动引用,将值从一种类型转换为另一种类型.就是说如果类型不匹配时,会自动寻找一个隐式方法,把这个格式不匹配的事情解决掉.
定义变量b为Int类型,但是赋予值2.34 是不对的,但是由于找到了隐式方法,所以自己转换了
object _011Test {def main(args: Array[String]): Unit = {val b:Int=2.34println(b)//2}implicit def double2Int(x:Double):Int=x.toInt
}
增强已有类的功能
就是说用到了一个类没有的功能时,系统会自动寻找有该功能的类,然后看是否有隐式方法可以把该类转换为有该功能的类.
import java.io.File
import scala.io.Sourceobject _011Test {def main(args: Array[String]): Unit = {import RichFile._//File类本身是没有read方法的,但是RichFile方法有read方法//当你强行要用File的read方法时,系统会自动查找别的类有没有read方法,然后再找是否有隐式方法可以把该类转为有read方法的那个类println(new File("D:\\tmp\\test.txt").read)}
}object RichFile {//隐式方法,用于把File类转为RichFile类implicit def file2RichFile(from: File): RichFile = new RichFile(from)
}//定义一个RichFile类,可以用于读取文件内容
class RichFile(val from: File) {def read: String = Source.fromFile(from.getPath).mkString
}
在编译过程中,当发现某一个类的对象调用了自己没有的方法,或者其他不正确的语法,一定会检查当前作用域的隐式函数,如果有此隐式函数,那么编译成功.
隐式参数
参数用implicit修饰的就是隐式参数. 隐式参数就是某些函数调用时没给传入参数,就拿隐式参数 当做自己的参数.有点奇葩的设计
example1:
调用时少传参数,报错
调用时少传参数,不报错,因为用了隐式参数隐式参数多了,报错,不知道用哪一个
object _012Test {def main(args: Array[String]): Unit = {implicit val x = 6implicit val y=7val l = sum(1)println(l)//7}def sum(x: Int)(implicit y: Int): Int = x + y
}
再比如. 如下比较器是个隐式参数,可以不用传入
object _011Test {def main(args: Array[String]): Unit = {//调用的时候并没有传入隐式参数println(compare(3, 5)) //-1}//2 个参数列表,其中一个为隐式参数,就是调用的时候可以不提供def compare[T](x: T, y: T)(implicit ordered: Ordering[T]): Int = {ordered.compare(x, y)}
}
隐式类
目的,不想创建新对象,用一个参数就想创建一个新对象.
比如 正常情况下
class xx(x:Int ){}
创建新对象是这样的
val p=new xx(5)
用来隐式类后,创建新对象是这样的
5
对象就创建完了. 啥也不需要了,直接给个构造函数的参数就完事了.
正常情况下
import scala.Console.println
import scala.annotation.tailrecobject _013Test {def main(args: Array[String]): Unit = {val p = new IntWithTimes(5)p.times(println("HI"))}
}object Helpers {class IntWithTimes(x: Int) {def times[A](f: => A): Unit = {@tailrecdef loop(current: Int): Unit =if (current > 0) {floop(current - 1)}loop(x)}}
}
隐式类情况,不用new直接调用. 或者说直接用参数就创建了一个新对象,这也太懒了
import scala.Console.println
import scala.annotation.tailrecobject _013Test {def main(args: Array[String]): Unit = {import Helpers._5 times(println("HI"))}
}object Helpers {implicit class IntWithTimes(x: Int) {def times[A](f: => A): Unit = {@tailrecdef loop(current: Int): Unit =if (current > 0) {floop(current - 1)}loop(x)}}
}
隐式引用
就是内置的一些包不需要import,系统会自己搞定.
比如,就是以下几个包,就是自动引用的,或者说隐式引用的
import java.lang._ // in JVM projects, or system namespace in .NET
import scala._ // everything in the scala package
import Predef._ // everything in the Predef object
ps:有个问题就是比如lang和scala都有String类的话,用哪个? 后导入的会覆盖先导入的,就是会用scala的,或者说lang包的String被隐藏了
总结
- 隐式方法 类型自动转换
- 隐式参数 懒得传参数
- 隐式类 不想new对象
- 总结,就是想少写点代码,让代码看起来整齐点
- 隐式能看懂源码即可,自己还是少用
scala 隐式转换与隐式参数相关推荐
- 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数
目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...
- scala中的隐式转换、隐式参数和隐式类
scala中的隐式转换.隐式参数和隐式类 @(SCALA)[scala] scala中的隐式转换隐式参数和隐式类 一隐式转换 1示例 2隐式转换的条件 二隐式参数 1示例 三隐式类 1示例 隐式转换是 ...
- Scala入门到精通——第十九节 隐式转换与隐式参数(二)
本节主要内容 隐式参数中的隐式转换 函数中隐式参数使用概要 隐式转换问题梳理 1. 隐式参数中的隐式转换 前一讲中,我们提到函数中如果存在隐式参数,在使用该函数的时候如果不给定对应的参数,则编译器会自 ...
- Scala入门到精通——第十八节 隐式转换与隐式参数(一)
本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介 在Scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性.要想 ...
- scala学习之旅(十三):隐式转换和隐式参数
文章地址:http://www.haha174.top/admin/article/list 1.引言 scala 提供的隐式转换和隐式参数功能,是非常有特色的功能.是java 等编程语言所没有的功能 ...
- Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...
Scala高级特性 1. 学习目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- scala入门-10 隐式转换、隐式参数、隐式类
到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下 ...
- Scala隐式转换之隐式类
隐式转换的目的就是为了扩展功能 隐式解析的机制
- mysql日期隐式转换_MySQL 隐式转换 | 剑花烟雨江南
MySQL 隐式转换的规则如下: 1. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回1,这两种都不需要做类型转换. 2 ...
最新文章
- ES6 一些常用使用
- WinExec, ShellExecute,CreateProcess的对比
- WordPress注册登录注册系统插件
- Redis 备份,容灾及高可用实战
- 一加7发布之后 雷军微博沦陷:米粉直呼心累
- 全球约39亿人未接入互联网 韩国家庭宽带普及率最高
- [转载] python divmod()函数
- 电影院订票选座小程序 开题报告
- 关闭计算机 网络设备上的445端口,关闭445端口的方法,小编教你电脑如何关闭445端口...
- 鸿鹄系统和鸿蒙系统的区别,华为鸿蒙系统和全新的鸿鹄处理器将于8月9日正式发布,荣耀首发...
- 笔记本电脑开机指示灯亮但显示屏没有反应(已解决)
- huya弹幕提取小尝试
- git如何撤销某次提交记录
- python文件同时读写_如何用python同时读写文件
- 当遇到“you may be a victim of software counterfeiting”这样的提示
- otg android 键盘,使用USB OTG将手机、平板连上键盘、U盘
- bzoj1085 骑士精神
- 野火多功能调试助手】-摄像头调试助手通讯协议
- [MySQL] 在线 DDL 工具 gh-ost 原理简介
- 关于兴业银行接口对接 注意事项
热门文章
- Pytorch的一些损失函数
- nc65 单据非向导开发 源代码_【免费毕设】ASP.NETIT产品网上物流管理信息系统的设计与实现(源代码+论文)...
- linux 路由跟踪命令_一文掌握linux系统路由跟踪指令traceroute
- vue3.0 组件使用 引用 传值 父传子 子传父
- 上岸后如何选择一个好的导师
- 在html中使用css的主要方式有,html中使用css的方法有哪几种
- c语言 int a 5,在C语言中,有如下的写法:int a = 5; int *pa; pa = (a + 1);
- pythonexcel模块哪个好_Python-Excel 模块哪家强?
- java object 判断null_java判断object为null
- linux序列比对程序,Linux程序管理:top.htop.glances,dstat等命令使用方法