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

@(SCALA)[scala]

  • scala中的隐式转换隐式参数和隐式类
  • 一隐式转换
    • 1示例
    • 2隐式转换的条件
  • 二隐式参数
    • 1示例
  • 三隐式类
    • 1示例

隐式转换是scala的精髓之一,它是一个十分强大的语言特性。

详细可参考《大数据spark企业级实践》最后一部分。

一、隐式转换

当为对象调用某个方法,而这个方法又不是这个对象的方法时,scala会寻找作用范围内的隐式转换来完成这个方法。

1、示例

我们试图给一个Int类型的值赋一个String:

val x: Int = "100"

这肯定是错的,我们应该使用toInt来作转换:

val x: Int = "100".toInt

如果有大量的转换,或者是一些复杂对象的转换,那是不是有点麻烦呢?因此我们定义一个这样的隐式转换函数:

implicit def strToInt(str: String) = str.toInt

只要这个函数在作用域内,则当需要Int值时,String会被自动转变为Int:

scala> implicit def strToInt(str: String) = str.toIntscala> 1+"100"
res0: String = 1100scala> def add(x:Int, y: Int) = x + y
add: (x: Int, y: Int)Intscala> add(1,100)
res2: Int = 101

注意,Int也能转化为String,因此1+“100”时,结果变为了1100

2、隐式转换的条件

(1)隐式转换必须以单一标识符的形式处于作用域内,或者与转换的源或者目标类型关联在一起。scala编译器将仅考虑作用于作用域之内的隐式转换。简而言之,就是在使用隐式转换之前,需要用import把隐式转换引用到当前的作用域中,或者就在作用域中定义隐式转换。除了隐式转换被引入进当前作用域之外,还有一种方式可以使用隐式转换,就是编译器会在源类型或者期望的伴生对象中寻找隐式定义。

(2)无歧义规则:隐式转换只有在无其它可用转换的前提下才能操作。如果在同一作用域中,对某一源类型定义一个以上的隐式转换函数,且它们都能匹配,那么编译器将报错,所以在使用时请移除不必要的隐式转换。

spark中的RDD调用pariRDDFuntion中定义的方法就是一个典型的隐式转换使用。

二、隐式参数

1、示例

package com.lujinhong.scalaDemoclass ImplicitParameterDemo {}object ImplicitParameterDemo {def testParam(implicit name: String) {println(name)}implicit val name = "lujinhong"def main(args: Array[String]) {testParam("My name")testParam}
}

上述示例中将testParam中的参数name设为了implicit,因此当name未赋值时,它会寻找作用域内叫做name的隐式参数所定义的值。有几个注意事项:
* 函数及隐式参数都必须定义为implicit
* 函数中的变量名称必须要隐式参数的名称一致。
* 也可以显式定义函数,如本例中的”My name”,此时隐式参数不生效。

因此,隐式参数与java中的默认参数很类似。

三、隐式类

1、示例

package com.lujinhong.scalaDemo.implicitdemoclass ImplicitClassDemo {}object ImplicitClassDemo {def main(args: Array[String]) {println(2.addOne(1))println(2.addOne(3))}implicit class Caculator(x: Int) {def addOne(a: Int): Int = a + 1}}

隐式类定义中的(x: Int) ,指定了当In这种类型可以在这个隐式类中寻找方法,即这个类中定义的所有方法都会成为Int的隐式函数。

如果想作用于String类型,请看:

package com.lujinhong.scalaDemo.implicitdemoclass ImplicitClassDemo {}object ImplicitClassDemo {def main(args: Array[String]) {println("d".addOne(1))println("kk".addOne(3))}implicit class Caculator(x: String) {def addOne(a: Int): Int = a + 1}}

scala中的隐式转换、隐式参数和隐式类相关推荐

  1. php隐式转换,隐式转换如何使用?总结隐式转换实例用法

    JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object.object是引用类型,其它的五种是基本类型或者是原始类型.我们可 ...

  2. oracle隐式转换能禁用吗,Oracle隐式转换

    和其他的关系型数据库一样, oracle 中也能进行一些隐式的数据转换,这对我们写 SQL 语句有 非常 用,我们可以不必麻烦地手动转化很多类型的字符.虽然前面我们介绍了一些使用例如to_char,t ...

  3. scala中的数组的转换操作

    1.共有两种操作 转换成一种新的数组 2.yield转换 3.函数式编程转换 转载于:https://www.cnblogs.com/juncaoit/p/6253913.html

  4. 【Scala】Scala中的模式匹配、类型参数与隐式转换

    1.模式匹配 (1)概述 模式匹配是Scala中非常有特色,非常强大的一种功能.模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理.但 ...

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

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

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

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

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

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

  8. scala当中的文件操作、网络请求和隐式转换

    scala当中的文件操作.网络请求和隐式转换 文件操作和网络请求 读取文件当中每一行的数据 读取词法单元和数字 读取网络资源.文件写入.控制台操作 读取网络资源 文件写入操作 控制台交互操作 scal ...

  9. 大数据Saprk----Spark基础-scala的隐式转换

    first Codec **public class Friend {public static void main(String[] args){System.out.println("B ...

最新文章

  1. 机器学习——模型测试与评估方法与指标
  2. 白盒测试之路径测试练习
  3. 必须了解的mysql三大日志-binlog、redo log和undo log
  4. Beautiful Soup-4.2.0
  5. 数据分析基础教程Numpy指南笔记
  6. 从源码编译InfluxDB
  7. 当年的聊天室,今天的我(java实现聊天室群聊功能)
  8. 课时 27:Kubernetes 安全之访问控制(匡大虎)
  9. JavaSE 学习参考:变量(1)
  10. linux操作系统分析 课程,《Linux操作系统》课程的现状与分析
  11. CSS中meta标签的viewport
  12. Scrapy爬取起点小说网数据导入MongoDB数据库
  13. 怎样开启无线热点服务器,Win7开启无线WIFI热点
  14. 202011.22深圳湾渐变晚霞-莫安迪原创摄影作品
  15. studio 3t连接linux上的MongoDB
  16. java软件测试经典案例,java语言编程案例 - Mrsjjl的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  17. python代码代写_python代写代码
  18. 如何快速的合并多个 Excel 工作簿成为一个工作簿?
  19. 22考研资料公共课专业课视频无偿分享
  20. fluentdata 访问mysql_AgileDataAccess

热门文章

  1. hdu 4588 Count The Carries 南京邀请赛
  2. Promise第三篇:async和await关键字
  3. ES6函数第一篇:参数篇
  4. 计算机秋招必备!上海互联网大厂企业整理清单!
  5. @ComponentScan配置扫描多个包
  6. docker容器的本地局域网yum源优化
  7. shell脚本每日一练(三)
  8. 这次来个BGP反射器的简单小实验
  9. 语言取10的整数倍_C语言结构体用法很多,坑也很多
  10. firedac连接mysql,FireDAC连接数据库