隐式转换

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1:隐式转换应用

1.1 隐式转换为期望类型

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

val i : Int = 3.5
<console>:10: error: type mismatch;found   : Double(3.5)required: Intval 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

转载于:https://my.oschina.net/yulinguo/blog/378204

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双“11”搞促销?用贪心算法来盘他!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;这几年商家为了刺激消费是变着花样的推出各种各样的活动&#xff0c;以某多多为首的运营式电商更是让我们看到了营销的无限“…

java保留两位小数4种方法

转自&#xff1a; http://blog.csdn.net/ming1683/article/details/31950584种方法&#xff0c;都是四舍五入&#xff0c;例&#xff1a;import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class format {double f 111231…

AndroidStudio使用入门

AndroidStudio使用入门1_AndroidStudio activity的基本使用1.1_MainActivity和activity_main的初识1.2_Activity的清单文件简介1.3_几种重要文件的介绍1.4_基本布局的认识与使用1.4.1_RelativeLayout(相对布局)1.4.2_线性布局2_访问资源的方式2.1_java访问资源的方式2.2_xml访问…

java计算时间差距_硬计算和软计算之间的差异

java计算时间差距什么是计算&#xff1f; (What is Computing?) The process of accomplishing a particular task with the help of a computer or a computing device is known as computing. It should provide precise and accurate solutions, also it makes easy to fin…

主键字母自动生成函数

-- 动态生成字母方式主键&#xff0c;A-Z 大于Z自动进位【26进制数值表示】-- 参数&#xff1a;动态查询表和主键列 create or replace function charkey (tabName char, pkName char) return char asv_key varchar2(4); -- 表中查询出当前主键列最大值v_char varchar2(…

26.颜色值缩写

关于颜色的css样式也是可以缩写的&#xff0c;当你设置的颜色是16进制的色彩值时&#xff0c;如果每两位的值相同&#xff0c;可以缩写一半。 例子1&#xff1a; p{color:#000000;} 可以缩写为&#xff1a; p{color: #000;} 例子2&#xff1a; p{color: #336699;} 可以缩写为&a…

面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景?

前言生活中用到的锁&#xff0c;用途都比较简单粗暴&#xff0c;上锁基本是为了防止外人进来、电动车被偷等等。但生活中也不是没有 BUG 的&#xff0c;比如加锁的电动车在「广西 - 窃格瓦拉」面前&#xff0c;锁就是形同虚设&#xff0c;只要他愿意&#xff0c;他就可以轻轻松…

计算机操作系统原理教程与实训(目录)

计算机操作系统原理教程与实训 第一章 计算机操作系统概论 1.1 操作系统的形成与发展 1.1.1 人工操作方式 1.1.2 脱机输入/输出技术 1.1.3 批处理技术 1.1.4 多道程序设计技术 1.2 操作系统的基本概念 1.2.1 操作系统的定义 1.2.2 操作系统的地位 1.2.3 操作系统的特征 1.2…

2万字,看完这篇才敢说自己真的懂线程池!

前言 线程池可以说是 Java 进阶必备的知识点了&#xff0c;也是面试中必备的考点&#xff0c;可能不少人看了一些文章后能对线程池工作原理说上一二&#xff0c;但这还远远不够&#xff0c;如果碰到比较有经验的面试官再继续追问&#xff0c;很可能会被吊打&#xff0c;考虑如下…

西南大学校园GIS平台

原文:西南大学校园GIS平台系统架构是B/S,开发语言是C#、silverlight&#xff0c;开发平台是.NET&#xff0c;数据库为sqlserver&#xff0c;这是我读研究生时候自己做的作品&#xff0c;以自己的母校为地图&#xff0c;进行GIS相关的功能分析&#xff0c;核心的模块有&#xff…

Android studio小问题解决

1_代码识别不出来问题 2_项目SDK与本地不匹配 先查看项目的SDK 增加本地SDK

使用类的银行管理系统的C ++程序

In this program, we are using the concept of C class and object, following basic operations are being performed here, 在此程序中&#xff0c;我们使用C 类和对象的概念&#xff0c;在此执行以下基本操作&#xff0c; Opening an account 开户 Show account info 显示…

2万字长文包教包会 JVM 内存结构

点击蓝色“Java中文社群”关注我哟加个“星标”&#xff0c;一起成长&#xff0c;做牛逼闪闪的技术人JVM ≠ Japanese Videos Man写这篇的主要原因呢&#xff0c;就是为了能在简历上写个“熟悉JVM底层结构”&#xff0c;另一个原因就是能让读我文章的大家也写上这句话&#xf…

vb.net 读写文件

读取和写入文件 以下示例将一行文本写入文件。 Write text to a file Sub WriteTextToFile() Dim file As New System.IO.StreamWriter("c:test.txt") file.WriteLine("Here is the first line.") file.Close() End Sub 以下示例将文件中的文本读取到…

Oracle 10g、11g :RAC关闭、启动、重启步骤

关闭顺序&#xff1a;【其他节点】-> [第一个节点]操作&#xff1a;step 1&#xff1a;{以grid用户或关闭监听&#xff1a; { crs_stop 监听器资源名 | srvctl stop listener } --全局|oracle用户关闭监听&#xff1a;{ lsnrctl stop } --单个节点}step 2&#xff1a;以orac…

虹软安卓人脸识别初学

1_下载SDK 进入虹软官网&#xff1a; 点击人脸识别SDK 进入开发者中心&#xff08;注册登录&#xff09; 新建应用并添加SDK 输入相应信息&#xff0c;确认 下载sdk 2_run示例代码注意事项 跑不起来的解决方法&#xff08;SDK版本不一致&#xff09; 3_激活并使用

css圆在中心根据宽度缩放_根据CSS中的容器宽度重新缩放字体

css圆在中心根据宽度缩放Introduction: 介绍&#xff1a; Dealing with fonts is a very interesting thing to do as fonts bring out the appearance of your website or a web page so you must choose the ideal fonts for your website or web page that helps in making…

vb.net 的 openFileDialog 控件文件筛选器使用

Filter 属性设置当前文件名筛选字符串&#xff0c;该字符串确定出现在对话框的“文件类型”框中的选项。 openFileDialog1.InitialDirectory "c:\\" ; openFileDialog1.Filter "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; openFileDialog1.Filter…

Java中不可或缺的59个小技巧,贼好用!

来源&#xff1a;https://blog.dogchao.cn/?p70《Effective JavaJava》名著&#xff0c;必读。如果能严格遵从本文的原则&#xff0c;以编写API的质量来苛求自己的代码&#xff0c;会大大提升编码素质。以下内容只记录了我自己整理的东西&#xff0c;还是建议读原文。为了聚焦…

c# contains_清单 .Contains()方法,以C#为例

c# containsC&#xff03;List <T> .Contains()方法 (C# List<T>.Contains() Method) List<T>.Contains() method is used to check whether list contains a specified element or not. List <T> .Contains()方法用于检查list是否包含指定的元素。 S…