scala上界与下界、协变与逆变
发布日期:2021-05-07 11:59:31 浏览次数:8 分类:原创文章

本文共 1807 字,大约阅读时间需要 6 分钟。

scala上界与下界

  类型的上界与下界,是用来定义类型变量的范围,作用于类。

scala上界(Upper Bounds)

  scala中上界定义[S <:T]类似于java中上界定义<? extends T>。

定义
S <: T
这是类型上界的定义,S必须是类型T的子类(或本身),自己也可以认为是自己的子类

代码实现:

class Animalsclass Bird extends Animalsclass Hawk extends Birdclass Upper [T <:Bird]{     def see(): Unit ={       println("look!!!")  }}object UpperDemo{     def main(args: Array[String]): Unit = {       //正确    new Upper[Hawk].see()    new Upper[Bird].see()    //错误    new Upper[Animals].see()  }}

scala下界(Lower Bounds)

定义:U >: T
  这是类型下界的定义,也就是说U必须是类型T的父类(或其本身)。
代码实现:

class Animals1class Bird1 extends Animals1class Hawk1 extends Bird1class Lower1 [U >:Bird1]{     def see(): Unit ={       println("look!!!")  }}object Lower1Demo{     def main(args: Array[String]): Unit = {       //正确    new Lower1[Bird1].see()    new Lower1[Animals1].see()    //错误    new Lower1[Hawk1].see()  }}

注意:同包下面的类名或者对象名不能重复

协变和逆变

协变

  Scala的类或特征的范型定义中,如果在类型参数前面加入+符号,就可以使类或特征变为协变了。

代码实现:

//父类:动物class Animal//子类:鸟class Bird extends Animalclass EatSomething[+T](t:T){   }object Demo1{     def main(args: Array[String]): Unit = {       //创建一个EatSomething[Bird]对象    val value = new EatSomething[Bird](new Bird)    //Bird 是Animal的子类,但是EatSomething[Bird] 不是EatSomething[Animal]的子类    var a:EatSomething[Animal] = value    //错误    var a1:EatSomething[Hawk]  = value  }}

  只能赋值给T的父类(或其本身)。

逆变

  在类或特征的定义中,在类型参数之前加上一个-符号,就可定义逆变范型类和特征了。

代码实现:

//父类:动物class Animal//子类:鸟class Bird extends Animal//子类:鹰class Hawk extends Birdclass EatSomething[-T](t:T){   }object Demo1{     def main(args: Array[String]): Unit = {       //创建一个EatSomething[Bird]对象    val value = new EatSomething[Bird](new Bird)    //Bird 是Animal的子类,但是EatSomething[Bird] 不是EatSomething[Animal]的子类    var a:EatSomething[Hawk]  = value    //错误    var a1:EatSomething[Animal] = value  }}

  只能赋值为T的子类(或其本身)。

上一篇:java稀疏数组
下一篇:scala隐式类型转换和隐式参数

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月15日 16时08分57秒