56.scala编程思想笔记——类型参数限制
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50447610
源码下载连接请见第一篇笔记。
如果想让一个枚举成为某个特征的子类型,如果是一个普通类,那么只需在继承时将继承时将该特征添加到基类型的列表中,但是在面对枚举时,必须通过从val继承来创建新的value类型。
例子如下:
import com.atomicscala.AtomicTest._
trait Resilience
object Bounciness extends Enumeration {
case class_Val() extends Val
withResilience
typeBounciness = _Val
val level1,level2, level3 = _Val()
}
import Bounciness._
object Flexibility extends Enumeration {
case class_Val() extends Val
withResilience
typeFlexibility = _Val
val type1,type2, type3 = _Val()
}
import Flexibility._
trait Spring[R <: Resilience] {
val res:R
}
case class BouncingBall(res:Bounciness)
extendsSpring[Bounciness]
BouncingBall(level2) is
"BouncingBall(level2)"
case class FlexingWall(res:Flexibility)
extendsSpring[Flexibility]
FlexingWall(type3) is "FlexingWall(type3)"
其中resilience是标记特征。
其中符号 <: 表示R必须是Resilience类型或某种继承自Resilience的类型。于此等价的表达是 Resilience是R的上界。
此外还可以通过类型限制实现对方法的调用:
import com.atomicscala.AtomicTest._
class WithF {
def f(n:Int)= n * 11
}
class CallF[T <: WithF](t:T) {
def g(n:Int)= t.f(n)
}
new CallF(new WithF).g(2) is 22
new CallF(new WithF {
override deff(n:Int) = n * 7
}).g(2) is 14
在CallF内可以调用f的唯一原因是其类型被限制为 WithF或 WithF的子类。
内联一个不具名的WithF子类,其方式是在new WithF 后面跟着花括号,中间包含继承类的类体。
类型参数限制远比此处复杂,是自身的一种代数。