Scala

Scala 专题教程-参数化类型(5): 类型上界

jerry Scala
本篇介绍类型上界,我们使用合并排序算法来给人名排序,这里先定义一个Person类,它派生于Ordered Trait,定义如下: class Person(val firstName:String, val lastName:String) extends Ordered[Per...
阅读全文

Scala 专题教程-参数化类型(4): 类型下界

jerry Scala
我们还是使用前面的Queue的例子,我们知道,我们不能使用+T(协变关系)来定义Queue,然而,我们可以通过给equeue方法本身提供一个类型参数使之一般化。 class Queue[+T] ( private val leading: List[T], priva

Scala 专题教程-参数化类型(3): Variance(类型变体)标识

jerry Scala
在上篇例子中定义的Queue是一个Trait,而不是一个类型,这是因为Queue需要一个类型参数才能构成一个类型, 也就是说你不可以直接创建一个类型为Queue的对象: scala> def doesNotCompile(q:Queue) {} <cons

Scala 专题教程-参数化类型(2): 信息隐藏

jerry Scala
上篇的Queue的实现在效率上来说还是比较高效的,但是却给类的使用者暴露一些不必要的实现细节,比如Queue的构造函数使用了两个List对象,其中一个还是个倒序的列表。本篇介绍如何隐藏这些不必要的信息。 在Java中,

Scala 专题教程-参数化类型(1): 概述和例子说明

jerry Scala
本专题介绍Scala的参数化类型,在介绍的过程中同时演示了信息隐藏的技术,这里我们通过实现一个纯函数化实现的队列来举例说明。 参数化类型帮助你实现通用的类型和Trait。比如通用的集合类Set,该通用集合类可以通过

Scala 专题教程-隐式变换和隐式参数(7):View 限定

jerry Scala
上篇的例子 def maxListImpParam[T](element:List[T]) (implicit orderer:T => Ordered[T]):T = element match { case L...
阅读全文

Scala 专题教程-隐式变换和隐式参数(8):当有多个隐含转换可以选择时

jerry Scala
有时在当前作用域可能存在多个符合条件的隐含转换,在大多数情况下,Scala编译器在此种情况下拒绝自动插入转换代码。隐含转换只有在转换非常明显的情况下工作良好,编译器只要例行公事插入所需转换代码即可。如果当

Scala 专题教程-隐式变换和隐式参数(6):隐含参数(二)

jerry Scala
隐含参数的另外一个用法是给前面明确定义的参数补充说明一些信息。 我们先给出一个没有使用隐含参数的例子: def maxListUpBound[T <:Ordered[T]](element:List[T]):T = element match { case...
阅读全文

Scala 专题教程-隐式变换和隐式参数(5):隐含参数(一)

jerry Scala
编译器可以自动插入implicit的最后一个用法是隐含参数。 比如编译器在需要是可以把someCall(a)修改为someCall(a)(b)或者new someClass(a) 修改为new SomeClass(a)(b),也就是说编译器在需要的时候会自动补充缺少的

Scala 专题教程-隐式变换和隐式参数(4):转换被方法调用的对象

jerry Scala
隐式变换也可以转换调用方法的对象,比如但编译器看到X.method,而类型X没有定义method(包括基类)方法,那么编译器就查找作用域内定义的从X到其它对象的类型转换,比如Y,而类型Y定义了method方法,编译器就首先使用