理论教育 Scala语言基础与开发实战:界定操作示例

Scala语言基础与开发实战:界定操作示例

时间:2023-11-24 理论教育 版权反馈
【摘要】:下面根据前几个小节所列的各个界定种类,分别给出具体的操作示例及其解析。上下界界定的操作示例。本示例包含边界的上界界定与下界界定,示例代码如下所示:查看Java类库的String类,可以看到String确实是Comparable[String]的子类,并且实现了compareTo方法,对应代码如下:视图界定的操作示例。

Scala语言基础与开发实战:界定操作示例

下面根据前几个小节所列的各个界定种类,分别给出具体的操作示例及其解析。

【例6-2】上下界界定的操作示例。

本示例包含边界的上界界定与下界界定,示例代码如下所示:

978-7-111-54169-1-Chapter06-12.jpg

978-7-111-54169-1-Chapter06-13.jpg

查看Java类库的String类,可以看到String确实是Comparable[String]的子类,并且实现了compareTo方法,对应代码如下:

978-7-111-54169-1-Chapter06-14.jpg

【例6-3】视图界定的操作示例。

本示例给出视图界定的应用实例并与上界界定进行比较,突出视图界定的限制条件,示例代码如下所示:

978-7-111-54169-1-Chapter06-15.jpg

978-7-111-54169-1-Chapter06-16.jpg

下面针对以下代码开始分析视图界定(要求存在类型间的隐式转换),相对应,当T为Int时,查找存在的Int到Comparable[Int]的隐式转换函数,同时通过该分析,进一步详细解析视图界定内部的工作原理,针对本例中的代码:

978-7-111-54169-1-Chapter06-17.jpg

1)首先,由代码first.compareTo(second)可知,当前在Int上调用了compareTo操作,因此可能需要一个隐式转换,对应Int的隐式转换,在预先导入的objectPredef中,能够查到Int可以隐式转换为RichInt类型,相关代码如下:

978-7-111-54169-1-Chapter06-18.jpg

进一步查看LowPriorityImplicits代码:

978-7-111-54169-1-Chapter06-19.jpg

其中,第4行代码定义了Int到RichInt的隐式转换函数,因此可以转换。

2)分析RichInt中是否有需要调用的compareTo方法(这一步分析也可以放到最前面),通过对RichInt类型的继承层次的分析,可得相关类图,如图6-1所示。

从图6-1中可以看出,RichInt继承了Comparable的compareTo方法,因此Int到RichInt的隐式转换在此有效,即first.compareTo(second)代码最终调用了RichInt继承下来的compa⁃reTo方法。

由Comparable的compareTo方法的实现可知,最终调用了compare方法,而同时在继承的子类OrderedProxy中也实现了compare的方法,具体代码如下所示:

978-7-111-54169-1-Chapter06-20.jpg

最终调用了类型为Ordering[T]的ord成员变量的compare方法,通过查看RichInt类的源码,可以看到ord被定义为scala.math.Ordering.Int,代码如下所示:(www.daowen.com)

978-7-111-54169-1-Chapter06-21.jpg

图6-1 RichInt类型的继承类图

978-7-111-54169-1-Chapter06-22.jpg

对应的scala.math.Ordering.Int,实际上是一个继承并实现compare方法的Ordering[Int]类型的一个隐式值,也就是最终调用了该隐式对象,实现了Int的比较,对应的隐式值对象定义如下:

978-7-111-54169-1-Chapter06-23.jpg

至此,已经成功得到T为Int类型的比较,同时也证明了确实存在Int到Comparable[Int]的隐式转换函数(参考RichInt类图)。●代码分析技巧:将以上代码复制到IDE(此处以IntelliJ IDEA为例)中,在代码val pairInt=new Pair NotPerfect(3,5)//Int->RichInt处设置断点,启动Debug,当到达该断点时,多次使用Force Step Into(Alt+Shift+F7),强制跟踪代码的调用细节,对应强制进入的按钮在调试工具栏中的位置如图6-2所示。

978-7-111-54169-1-Chapter06-24.jpg

图6-2 调试按钮工具栏

●补充说明:上面分析中没有给出各个类的具体路径,可以在对应的IntelliJ IDEA中通

过Ctrl+N组合键打开类型查找窗口,查找指定类型。

【例6-4】上下文界定的操作示例。

注意本例中上下文界定与视图界定之间的差异所在,示例代码如下所示:

978-7-111-54169-1-Chapter06-25.jpg

通过查看Scala类库中Ordering的定义,可以看到其中已经提供了许多Ordering[T]类型的隐式值,比如Ordering[String]隐式值的定义代码如下所示:

978-7-111-54169-1-Chapter06-26.jpg

另外,在Ordering中已经定义了许多常见类型T的Ordering[T]隐式值。

补充说明:这里的Ordering不需要导入,对应在Scala中的package object scala已经给出了类型别名,因此可以直接使用,对应代码如下所示:

978-7-111-54169-1-Chapter06-27.jpg

【例6-5】多重界定的操作示例。

本示例以多重上下文界定为例给出多重界定的使用说明,示例代码如下所示:

978-7-111-54169-1-Chapter06-28.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈