作用

简单说,隐式转换就是:当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. ssh首次链接出现yes/no提示和ansible提示

    修改文件: /etc/ssh/ssh_config 在文件中添加如下信息:StrictHostKeyChecking no 改本机的/etc/ssh/ssh_config文件中的"# Str ...

  2. Eclipse换DarkestDark主题之后,无法使用快捷键

    问题出现: 在选用Eclipse插件的MarketPlace的时候,发现一个下载量很高的主题,看起来很不错,毫不犹豫的就下下来了. 说时迟那时快,下下来之后果然好看,不过问题也来了,快捷键失效了,Ct ...

  3. 多分类度量gini index

    第一份工作时, 基于 gini index 写了一份决策树代码叫ctree, 用于广告推荐. 今天想起来, 好像应该有开源的其他方法了. 参考 https://www.cnblogs.com/mlhy ...

  4. ruoyi LogUtils

    package com.ruoyi.framework.util; import java.io.PrintWriter; import java.io.StringWriter; import ja ...

  5. centos 下使用 pytesseract 识别文字

    偶发一个想法搭一个验证码识别工具,网上查了一下有Tesseract 这个工具可以识别,所以有了后面一小时的搭建过程 ps:Ubuntu 下似乎可以直接用包管理工具来安装,我使用的源码编译安装 前提 由 ...

  6. 富文本编辑器Tinymce的示例和配置

    Demo链接: https://download.csdn.net/download/silverbutter/10557703 有时候需要验证tinyMCE编辑器中的内容是否符合规范(不为空),就需 ...

  7. uboot对Flash和DDR的分区管理

    1.uboot阶段对Flash的分区 (1).所谓分区,就是对Flash进行分块管理. (2).PC机等产品中,因为大家都是在操作系统下使用硬盘的,整个硬盘由操作系统统一管理,操作系统会使用文件系统帮 ...

  8. TabControl+ListView

    #include <windows.h> #include <commctrl.h> #include <tlhelp32.h> #include "re ...

  9. [Algo] 223. Add Two Numbers

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  10. Please select an empty folder to install Android Studio

    原因 当前安装的Android Studio的文件夹不是空的 解决 把路径改成一个空文件夹即可