scala上界与下界、协变与逆变

scala上界与下界

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

scala上界(Upper Bounds)

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

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

代码实现:

class Animals



class Bird extends Animals


class Hawk extends Bird



class 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 Animals1

class Bird1 extends Animals1


class Hawk1 extends Bird1



class 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 Animal

class 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 Bird

class 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的子类(或其本身)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值