Scala-类型参数和界定
2016-10-05 10:15
155 查看
1.协变和逆变
下面以队列为例trait Queue[T]{ //some trait member.... }
我们知道AnyRef是String的超类,但能否说Queue[String就是Queue[AnyRef]的子类类型呢?从更加广泛的意义上来说,如果S是T的子类型,那么能否把Queue[S]当作Queue[T]的子类类型?
答案是否定的,但是Scala的另一种特效----协变(Covariant)就可以实现上面的功能
trait Queue[+T]{ //some trait member.... }与之对应的就是逆变(Contravariant),如果S是T的子类型,这将隐含着Queue[S]是Queue[T]的子类型 (有点奇怪)
trait Queue[-T]{ //some trait member.... }下面看下一个具体的例子Cell单元格类,它具有简单的读写操作
class Cell[T] (init:T) { private[this] var current=init def get=current def set(x:T){current=x} }下面的操作会报错
val c1=new Cell[String]("abc") //正常 val c2:Cell[AnyRef]=c1 //类型不匹配异常
但是把Cell的声明如下,就不会出现异常了
class Cell[+T] (init:T) { }但是上面的类还是存在一些潜在的问题,比如
def main(args: Array[String]) { val c1=new Cell[String]("abc") //正常 val c2:Cell[AnyRef]=c1 //正常 c2.set(1) //正常 val s:String=c1.get //把int类型赋值给了String类型 异常 }其实上面的操作都是由于下面的语句导致
def set(x:T){current=x}所有这类问题得多加注意,书上给出了一条经验之谈--“”不允许使用+号注解的类型参数作为方法参数类型”
2.上界
比如下面的列子,Comparable[T]就是T的上界,T是Comparable[T]的子类,它具有compareTo方法,否则使用的时候会报错class Compare2[T<:Comparable[T]](val first:T,val second:T ){ def compare=if(first.compareTo(second)>0) 1 else 0 }
3.下界
其中T为R的下界,也就是说R为T的超类。这里new了一个父类型class LowerBounds[+T](val first:T) { def replace[R >: T](newFirst:R)=new LowerBounds[R](newFirst) }
4.视图界定
视图界定(Views Bounds),其符号为 T <% S,其和上界类似。以下面的代码为例,Int类型是没有继承Ordered类型的,但是因为使用了隐式转换(待分析),它会自动把Int转换成RichInt类型,而RichInt继承了Ordered类型class Compare3[T<%Ordered[T]](val first:T,val second:T ){ def compare=if(first>second) 1 else 0 } val c=new Compare3[Int](2,1); //Int->RichInt
相关文章推荐
- Scala 类型参数的界定
- scala类型参数的问题
- Scala中抽象类型成员 VS 抽象类型参数
- Scala类型参数中协变(+)、逆变(-)、类型上界(<:)和类型下界(>:)的使用
- Programming In Scala笔记-第十九章、类型参数,协变逆变,上界下界
- Programming In Scala笔记-第十九章、类型参数,协变逆变,上界下界
- Scala类型参数中协变(+)、逆变(-)、类型上界(<:)和类型下界(>:)的使用
- scala类型系统:14) multiple bounds-多重界定
- Scala类型参数中协变(+)、逆变(-)、类型上界(<:)和类型下界(>:)的使用
- 快学Scala第17章----类型参数
- scala类型系统:12) view bounds-视图界定
- Scala入门到精通——第十七节 类型参数(一)
- scala学习笔记(十六) 类型参数与隐式转换
- Scala中上下文界定内幕中的隐式参数与隐式参数的实战详解及其在Spark中的应用源码解析之Scala学习笔记-52
- Scala类型参数中协变(+)、逆变(-)、类型上界(<:)和类型下界(>:)的使用
- Scala 隐式类型之隐式参数
- Scala 深入浅出实战经典 第62讲:Scala中上下文界定内幕中的隐式参数实战详解
- 第62讲:Scala中上下文界定内幕中的隐式参数与隐式参数的实战详解及其在Spark中的应用源码解析学习笔记
- Scala入门之类型参数
- scala类型系统:13) context bounds-上下文界定