文档章节

隐式转换

blue1110
 blue1110
发布于 2015/02/12 18:23
字数 719
阅读 21
收藏 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
南京
程序员
私信 提问
scala implicit 关键字

implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把最后一个参数列表标记为implicit,表示该组参数是隐式参数。一个方法只会有一个隐式参数列表,...

张欢19933
04/27
0
0
对Scala隐式转换的一些总结

以下讨论基于Scala 2.7/2.8 Scala提供的隐式转换特性可以在效果上给一个类增加一些方法,或者用于接收不同类型的对象,然而使用Scala的隐式转换是有一定的限制的,总结如下 implicit关键字只...

ggd543archer
07/28
0
0
《CLR Via C# 第3版》笔记之(八) - 类型的转换构造器和方法

主要内容 类型的转换构造器 显式/隐式的转换操作符 1. 类型的转换构造器 类型转换构造器是指 通过一种类型(比如Type1)的实例来构造另一种类型(比如Type2)的实例。 一般用于: 1) Type1和...

zting科技
2017/10/17
0
0
c++ explicit 修饰符

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p...

liangtee
2013/05/01
0
6
Scala中隐式转换(implicit conversion)的优先顺序

在学习Scala的时候,隐式转换(implicit conversion)这个特性让我实在是闹不住啊。于是乎一边试用一边感慨:真的是太强大,太方便了。 不过,越是强大且方便的东西,越容易用出毛病来。在我...

凯奥斯
2013/08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 其实我在地板也睡不着

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @witt-z :分享歌词: 阴天 在不开灯的房间,当所有思绪都一点一点沉淀。 分享莫文蔚的单曲《阴天》: 《阴天》- 莫文蔚 手机党少年们想听歌,...

小小编辑
8分钟前
9
3
微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
3
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部