abstract class MaxCell extends AbsCell {
type T <: Ordered { type O = T }
def setMax(x: T) = if (get < x) set(x)
}
这里,T的类型声明受到一个上类型界限的约束由类名Ordered和细分{ type O = T }组成
上界将子类中T的特化限制为Ordered的子类型,其类型成员O属于equals T.
由于这个约束,Ordered类的<方法保证适用于接收器和类型为t的参数
这个例子表明,有界类型成员本身可以作为有界的一部分出现
(即Scala支持F-bounded多态性)
(注,来自Peter Canning, William Cook, Walter Hill, Walter Olthoff论文:
有界量化是由Cardelli和Wegner引入的,作为对给定类型的所有子类型统一操作的函数类型的一种方法
他们定义了一个简单的“对象”模型,并使用有界量化来类型检查函数,这些函数对具有指定“属性”集的所有对象都有意义
面向对象语言的更现实的表示将允许对象是递归地定义类型. . 0的元素
在这种情况下,有界量化不再服务于预期的目的。很容易找到对所有具有指定方法集的对象都有意义的函数,但在Cardelli-Wegner系统中不能键入这些函数
为了在面向对象语言中为类型化多态函数提供基础,我们引入了f有界量化)
//one trait to rule them all
trait OO[O <: OO[O]] { this : O =>
type A <: AA[O]
type B <: BB[O]
type C <: CC[O]
}
trait AA[O <: OO[O]] { this : O#A =>
type A = O#A
type B = O#B
type C = O#C
def left(l:B):C
def right(r:C):B = r.left(this)
def join(l:B, r:C):A
def double(l:B, r:C):A = this.join( l.join(r,this), r.join(this,l) )
}
trait BB[O <: OO[O]] { this : O#B =>
type A = O#A
type B = O#B
type C = O#C
def left(l:C):A
def right(r:A):C = r.left(this)
def join(l:C, r:A):B
def double(l:C, r:A):B = this.join( l.join(r,this), r.join(this,l) )
}
trait CC[O <: OO[O]] { this : O#C =>
type A = O#A
type B = O#B
type C = O#C
def left(l:A):B
def right(r:B):A = r.left(this)
def join(l:A, r:B):C
def double(l:A, r:B):C = this.join( l.join(r,this), r.join(this,l) )
}