作用

简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型。
话不多说,直接测试

ImplicitHelper.scala
package com.donews.localspark

/**
* Created by reynold on 2017/3/20.
*/ object ImplVal {
implicit val name: String = "reynold"
} /**
* 定义成trait的话,可以让ScalaDemo继承,这样就可以自动引入了
*/
trait ImplVal {
implicit val name: String = "reynold"
} object ImplicitHelper {
/**
* 隐式参数
* 隐式参数一般和柯里化进行结合,使用该函数不用给出implicit的值
*
* @param param
* @param impl
*/
def echo(param: String)(implicit impl: String) {
println(param + "," + impl)
} /**
* 隐式转换函数是指在同一个作用域下面,一个给定输入类型并自动转换为指定返回类型的函数,
* 这个函数和函数名字无关,和入参名字无关,只和入参类型以及返回类型有关
*
* @param str
* @return
*/
implicit def strToInt(str: String) = str.toInt /**
* 隐式类有如下几个限制:
* They must be defined inside of another trait/class/object.
* They may only take one non-implicit argument in their constructor.
* There may not be any method, member or object in scope with the same name as the implicit class.
* Note: This means an implicit class cannot be a case class.
* 隐式类的运作方式:
* 隐式类的主构造函数只能有一个参数(有两个以上并不会报错,但是这个隐式类永远不会被编译器作为隐式类在隐式转化中使用)
* 且这个参数的类型就是将要被转换的目标类型
* 隐式转换类将包裹目标类型,隐式类的所有方法都会自动"附加"到目标类型上
*
* @param origin 隐式类构造函数参数
*/
implicit class ImpAdd(origin: Int) {
def add(param: Int) = origin + param
} }
ScalaDemo.scala
package com.donews.reynold

//import com.donews.localspark.ImplVal
import com.donews.localspark.ImplicitHelper.{ImpAdd, echo, strToInt}
import com.donews.localspark.ImplVal.name /**
* Created by reynold on 2017/3/16.
*/
object ScalaDemo /*extends ImplVal*/ {
def main(args: Array[String]): Unit = {
println(1.add(2))
//import com.donews.localspark.ImplicitHelper.strToInt 源码一般放在上面
println(strToInt("1"))
println(math.max("1", 2)) echo("hello")("word")
//import com.donews.localspark.ImplVal.name
echo("hello")
//或者像下面这样
//implicit val impl = "implicit"
//echo("hello")
}
}

结果为:

3
1
2
hello,word
hello,reynold

隐式解析机制

即编译器是如何查找到缺失信息的,解析具有以下两种规则:
1.首先会在当前代码作用域下查找隐式实体(隐式方法  隐式类 隐式对象)
 
2.如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找(如上面代码中的extends部分)
类型的作用域是指与该类型相关联的全部伴生模块,一个隐式实体的类型T它的查找范围如下:
    (1)如果T被定义为T with A with B with C,那么A,B,C都是T的部分,在T的隐式解析过程中,它们的伴生对象都会被搜索
    (2)如果T是参数化类型,那么类型参数和与类型参数相关联的部分都算作T的部分,比如List[String]的隐式搜索会搜索List的
伴生对象和String的伴生对象
    (3) 如果T是一个单例类型p.T,即T是属于某个p对象内,那么这个p对象也会被搜索
    (4) 如果T是个类型注入S#T,那么S和T都会被搜索
 
参考:
http://m.2cto.com/kf/201603/493264.html
https://my.oschina.net/aiguozhe/blog/35968
http://www.cnblogs.com/MOBIN/p/5351900.html
http://blog.csdn.net/oopsoom/article/details/24643869

实例理解scala 隐式转换(隐式值,隐式方法,隐式类)的更多相关文章

  1. 深入理解Scala的隐式转换系统

    摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码.   使用方式: 1. ...

  2. 转载:深入理解Scala的隐式转换系统

    摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码.   使用方式: 1. ...

  3. 深入理解Scala的隐式转换

    摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码.   使用方式: 1. ...

  4. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  5. Scala 隐式转换及应用

    什么是隐式转换 我们经常引入第三方库,但当我们想要扩展新功能的时候通常是很不方便的,因为我们不能直接修改其代码.scala提供了隐式转换机制和隐式参数帮我们解决诸如这样的问题. Scala中的隐式转换 ...

  6. Scala之隐式转换

    概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型. 隐式转换有四种常见的使用场景: 将某一类 ...

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

    作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...

  8. 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数

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

  9. Scala入门系列(十二):隐式转换

    引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...

随机推荐

  1. Ubuntu apt install 下载软件很慢的解决办法

    1.打开/etc/apt/sources.list 将内容替换为以下内容(注意把sources.list文件备份一下) deb http://mirrors.aliyun.com/ubuntu/ xe ...

  2. MySQL学习笔记——〇六SQLAlchemy框架

    我们在前面所用的方法都是在可视化的视图软件或者terminal里直接写SQL语句来对数据库进行访问,这里我们大概讲一下一个新的框架——SQLAlchemy. OEM框架 OEM的概念 对象-关系映射( ...

  3. IDEA抽取方法的快捷键

    正常的话是 ctrl+alt+m 如果快捷键占用或者修改过,在写代码的地方右键->refactor->extract->method

  4. eclipse配置tomcat详细步骤

    1.下载tomcat9并解压到D盘根目录下 2.Windows——>Preferences——>Server——>Runtime Environments——>Add 3.选择 ...

  5. Cracking Digital VLSI Verification Interview 第四章

    目录 Hardware Description Languages Verilog SystemVerilog 对Cracking Digital VLSI Verification Intervie ...

  6. Exchange 2016 CU3 安装失败解决方法

    Exchange 2016 CU3 安装失败解决方法 1. 问题: 由于前期安装过Exchange 2010 ,服务器非正常删除,后期人员无法跟进,在新安装Exchange 2016时准备工作正常完成 ...

  7. python+Sqlite+Dataframe打造金融股票数据结构

    5. 本地数据库 很简单的用本地Sqlite查找股票数据. DataSource类,返回的是Dataframe物件.这个Dataframe物件,在之后的业务,如计算股票指标,还需要特别处理. impo ...

  8. FJ的字符串-简单递归

    FJ的字符串-简单递归 问题描述FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其 ...

  9. 阿里云-容器服务之集群服务 k8s(Jenkins+gitlab+k8s的devops)- 01

    由于docker官方停止更新Swarm,另外swarm在使用期间出现了很多bug,所以阿里云也在2019年7月发布公告:于2019年12月31日起停止技术支持,请您尽快迁移至容器服务Kubernete ...

  10. 题解 P2382 【化学分子式】

    题目 不懂为什么,本蒟蒻用在线算法打就一直炸...... 直到用了"半离线"算法...... 一遍就过了好吗...... 某位机房的小伙伴一遍就过了 另一位机房的小伙伴也是每次都爆 ...