文档章节

隐式转换

blue1110
 blue1110
发布于 2015/02/12 18:23
字数 719
阅读 29
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

1:隐式转换应用

1.1 隐式转换为期望类型

    隐式转换为期望类型是编译器会使用隐式操作的第一个地方。一旦编译器看到了X,但是需要Y,就会检查从X到Y的隐式转换函数。例如:

val i : Int = 3.5
<console>:10: error: type mismatch;
 found   : Double(3.5)
 required: Int
       val i : Int = 3.5

然而,可以通过定义隐式转换消除这个问题:

implicit def doubleToInt(x: Double) = x.toInt
scala> val i : Int = 3.5
i: Int = 3

 过程如下:编译器看到了3.5 Double,但是它需要Int(此处导致类型错误),但是它搜索了从Double到Int的隐式转换,发现 doubleToInt(因为doubleToInt可以当作单一标示符处于作用域当中),实际上,代码后来变成:

val i : Int = doubleToInt(3.5)

1.2 转换接收者

   隐式转换同样还应用于方法调用的接收者,也就是方法调用的对象。

 a:与新类型的交互操作

    接收者转换的主要用途之一是使得新类型更为平滑地集成到现存类型当中。例如,如下有个例子:

Rational 类的片段

class Rational(n:Int,d:Int){
...
def + (that:Rational):Rational = ...
def + (that:Int):Rational = ...
...
}

Rational类有两个重载的+号方法变体,分别带 Rational 以及Int为参数。可以做有理数之间的加法,以及有理数加上整数:

val oneHalf = new Rational(1,2)
oneHalf + oneHalf
oneHalf + 1

但是:1 + oneHalf 却有问题,因为Int并没有合适的加有理数的方法。

此处,我们可以定义从Int到Rational的隐式转换:

implicit def intToRational(x:Int) = new Rational(x,1)

    b:模拟新的语法

    隐式转换的另一种主要用途是模拟添加新的语法。

比如: Map(1-> "one",2->"two")

而 -> 只是定义在标准scala序文(scala.predef)中的类 ArrowAssoc的方法。这个序文还定义了从Any到ArrowAssoc的隐式转换。在 1-> "one" 的时候,编译器会插入从1到ArrowAssoc的转换以便找到 ->方法。以下是相关的定义:

package scala
object Predef{
    class ArrowAssoc[A](x:A){
        def -> [B](y:B):Tuple2[A,B] = Tuple2(x,y) 
    }
    implicit def any2ArrowAssoc[A](x:A):ArrowAssoc[A]=
        new ArrowAssoc(x)
        ....
}


2.隐式转换规则

 a.标记规则:只有标记为implicit才能可用

 b.做用户规则:插入的隐式转换必须以单一标识符的形式处于作用域中,或者跟转换的源或目标类型关联在一起。

例外只有一个:编译器还会在源类型活着转换的期望目标类型的伴生对象中寻找隐事定义。例如:

object Dollar{
 implicit def dollarToEuro(x:Dollar):Euro = ...
}
class Dollar{
}

c.无歧义规则:不存在其他可插入的转换

d:单一调用规则:只会尝试一个隐事操作

e:显式操作先行


PS:文章整理自 Programming in scala

© 著作权归作者所有

上一篇: Spark Naive Bayes
下一篇: Scala Closures 闭包
blue1110
粉丝 8
博文 13
码字总数 7360
作品 0
南京
程序员
私信 提问
加载中

评论(0)

Scala 隐式转换和隐式参数

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

osc_btnnkvs0
2019/09/01
1
0
九、Scala从入门到精通一一隐式转换和隐式值

目录 9.1、隐式转换 9.1.1、提出问题 先看一段代码,引出隐式转换的实际需要=>指定某些数据类型的相互转化 9.1.2、隐式函数基本介绍 隐式转换函数是以implicit关键字声明的带有单个参数的函数...

lerap
04/09
0
0
Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数

Scala高级特性 1. 学习目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中...

osc_e40tymzn
2019/06/03
4
0
Spark基础-scala学习(八、隐式转换与隐式参数)

大纲 隐式转换 使用隐式转换加强现有类型 导入隐式转换函数 隐式转换的发生时机 隐式参数 隐式转换 要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可。Scala会自动使用隐式转换函数...

osc_994n5tsc
2018/12/17
1
0
Scala 隐式(implicit)详解

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

虾皮
2018/04/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

图片转换为pdf可以吗?图片是否可以制作成电子书?

严格来说,PDF文件和图片文件还真的挺像的,图片文件中可以包含有文字、图片等信息,PDF文件中也可以包含有图片、文字等信息,那么问题来了,图片转换为pdf可以吗?我们知道,很多电子书都是...

dawda
13分钟前
23
0
Adobe Dreamweaver CC 2019 安装教程

一、DW简介 Adobe Dreamweaver,简称“DW”,中文名称 "梦想编织者",最初为美国MACROMEDIA公司开发 ,2005年被Adobe公司收购。DW是集网页制作和管理网站于一身的所见即所得网页代码编辑器。...

微笑涛声
13分钟前
17
0
Serverless 选型:深度解读 Serverless 架构及平台选择

作者 | 悟鹏 阿里巴巴技术专家 导读:本文尝试以日常开发流程为起点,分析开发者在每个阶段要面对的问题,然后组合解决方案,提炼面向 Serverless 的开发模型,并与业界提出的 Serverless 产...

osc_sxdofc9c
14分钟前
28
0
pdf图片提取怎么操作?如何提取pdf文档中的图片?

pdf文件的定位便是一款不可编辑的文件,当然,如果要使用pdf中的文字信息,还是很简单的,再不济,咱们可以直接手打,将这些文字信息给打出来,那么如果想要使用的是pdf中的图片信息怎么办呢...

深蓝月上
14分钟前
20
0
MATLAB安装libsvm工具箱的方法

支持向量机(support vector machine,SVM)是机器学习中一种流行的学习算法,在分类与回归分析中发挥着重要作用。基于SVM算法开发的工具箱有很多种,下面我们要安装的是十分受欢迎的libsvm工...

osc_n3mzii7x
15分钟前
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部