博客
关于我
scala上界与下界、协变与逆变
阅读量:330 次
发布时间:2019-03-04

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

转载地址:http://tuve.baihongyu.com/

你可能感兴趣的文章
JavaFX\FXML\CSS的简单使用
查看>>
【python】理解列表推导式以及列表推导式嵌套
查看>>
pythonBug入门——从零开始学python
查看>>
Vue.js——v-model结合checkbox类型——2020.11.22
查看>>
Mybatis核心配置文件--常用标签详解
查看>>
R语言练习题答案(3)
查看>>
jQuery 事件及动画
查看>>
[电影]《Ladybird》演绎完整18岁的青春
查看>>
js中[]、{}、()的区别
查看>>
js-禁止右键菜单代码、禁止复制粘贴代码
查看>>
血色先锋队
查看>>
win10系统安装配置Go环境包(第0章)
查看>>
搭建samba服务器
查看>>
Java: 错误: 不支持发行版本 5
查看>>
顺序表的操作总结
查看>>
Java基础语法
查看>>
原创-开发问题指南
查看>>
文本情感分类
查看>>
Python模块_os文件_目录方法
查看>>
部署kuboard3 管理工具
查看>>