下面根据前几个小节所列的各个界定种类,分别给出具体的操作示例及其解析。
【例6-2】上下界界定的操作示例。
本示例包含边界的上界界定与下界界定,示例代码如下所示:
查看Java类库的String类,可以看到String确实是Comparable[String]的子类,并且实现了compareTo方法,对应代码如下:
【例6-3】视图界定的操作示例。
本示例给出视图界定的应用实例并与上界界定进行比较,突出视图界定的限制条件,示例代码如下所示:
下面针对以下代码开始分析视图界定(要求存在类型间的隐式转换),相对应,当T为Int时,查找存在的Int到Comparable[Int]的隐式转换函数,同时通过该分析,进一步详细解析视图界定内部的工作原理,针对本例中的代码:
1)首先,由代码first.compareTo(second)可知,当前在Int上调用了compareTo操作,因此可能需要一个隐式转换,对应Int的隐式转换,在预先导入的objectPredef中,能够查到Int可以隐式转换为RichInt类型,相关代码如下:
进一步查看LowPriorityImplicits代码:
其中,第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的方法,具体代码如下所示:
最终调用了类型为Ordering[T]的ord成员变量的compare方法,通过查看RichInt类的源码,可以看到ord被定义为scala.math.Ordering.Int,代码如下所示:(www.daowen.com)
图6-1 RichInt类型的继承类图
对应的scala.math.Ordering.Int,实际上是一个继承并实现compare方法的Ordering[Int]类型的一个隐式值,也就是最终调用了该隐式对象,实现了Int的比较,对应的隐式值对象定义如下:
至此,已经成功得到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所示。
图6-2 调试按钮工具栏
●补充说明:上面分析中没有给出各个类的具体路径,可以在对应的IntelliJ IDEA中通
过Ctrl+N组合键打开类型查找窗口,查找指定类型。
【例6-4】上下文界定的操作示例。
注意本例中上下文界定与视图界定之间的差异所在,示例代码如下所示:
通过查看Scala类库中Ordering的定义,可以看到其中已经提供了许多Ordering[T]类型的隐式值,比如Ordering[String]隐式值的定义代码如下所示:
另外,在Ordering中已经定义了许多常见类型T的Ordering[T]隐式值。
补充说明:这里的Ordering不需要导入,对应在Scala中的package object scala已经给出了类型别名,因此可以直接使用,对应代码如下所示:
【例6-5】多重界定的操作示例。
本示例以多重上下文界定为例给出多重界定的使用说明,示例代码如下所示:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。