隐式转换函数

指的是以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 隐式转换与隐式参数相关推荐

  1. 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数

    目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...

  2. scala中的隐式转换、隐式参数和隐式类

    scala中的隐式转换.隐式参数和隐式类 @(SCALA)[scala] scala中的隐式转换隐式参数和隐式类 一隐式转换 1示例 2隐式转换的条件 二隐式参数 1示例 三隐式类 1示例 隐式转换是 ...

  3. Scala入门到精通——第十九节 隐式转换与隐式参数(二)

    本节主要内容 隐式参数中的隐式转换 函数中隐式参数使用概要 隐式转换问题梳理 1. 隐式参数中的隐式转换 前一讲中,我们提到函数中如果存在隐式参数,在使用该函数的时候如果不给定对应的参数,则编译器会自 ...

  4. Scala入门到精通——第十八节 隐式转换与隐式参数(一)

    本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介 在Scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性.要想 ...

  5. scala学习之旅(十三):隐式转换和隐式参数

    文章地址:http://www.haha174.top/admin/article/list 1.引言 scala 提供的隐式转换和隐式参数功能,是非常有特色的功能.是java 等编程语言所没有的功能 ...

  6. Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...

    Scala高级特性 1.    学习目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  7. scala入门-10 隐式转换、隐式参数、隐式类

    到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下 ...

  8. Scala隐式转换之隐式类

    隐式转换的目的就是为了扩展功能 隐式解析的机制

  9. mysql日期隐式转换_MySQL 隐式转换 | 剑花烟雨江南

    MySQL 隐式转换的规则如下: 1. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回1,这两种都不需要做类型转换. 2 ...

最新文章

  1. ES6 一些常用使用
  2. WinExec, ShellExecute,CreateProcess的对比
  3. WordPress注册登录注册系统插件
  4. Redis 备份,容灾及高可用实战
  5. 一加7发布之后 雷军微博沦陷:米粉直呼心累
  6. 全球约39亿人未接入互联网 韩国家庭宽带普及率最高
  7. [转载] python divmod()函数
  8. 电影院订票选座小程序 开题报告
  9. 关闭计算机 网络设备上的445端口,关闭445端口的方法,小编教你电脑如何关闭445端口...
  10. 鸿鹄系统和鸿蒙系统的区别,华为鸿蒙系统和全新的鸿鹄处理器将于8月9日正式发布,荣耀首发...
  11. 笔记本电脑开机指示灯亮但显示屏没有反应(已解决)
  12. huya弹幕提取小尝试
  13. git如何撤销某次提交记录
  14. python文件同时读写_如何用python同时读写文件
  15. 当遇到“you may be a victim of software counterfeiting”这样的提示
  16. otg android 键盘,使用USB OTG将手机、平板连上键盘、U盘
  17. bzoj1085 骑士精神
  18. 野火多功能调试助手】-摄像头调试助手通讯协议
  19. [MySQL] 在线 DDL 工具 gh-ost 原理简介
  20. 关于兴业银行接口对接 注意事项

热门文章

  1. Pytorch的一些损失函数
  2. nc65 单据非向导开发 源代码_【免费毕设】ASP.NETIT产品网上物流管理信息系统的设计与实现(源代码+论文)...
  3. linux 路由跟踪命令_一文掌握linux系统路由跟踪指令traceroute
  4. vue3.0 组件使用 引用 传值 父传子 子传父
  5. 上岸后如何选择一个好的导师
  6. 在html中使用css的主要方式有,html中使用css的方法有哪几种
  7. c语言 int a 5,在C语言中,有如下的写法:int a = 5; int *pa; pa = (a + 1);
  8. pythonexcel模块哪个好_Python-Excel 模块哪家强?
  9. java object 判断null_java判断object为null
  10. linux序列比对程序,Linux程序管理:top.htop.glances,dstat等命令使用方法