
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的子类(或其本身)。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月15日 16时08分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
谷歌最新提出无需卷积、注意力 ,纯MLP构成的视觉架构
2019-03-04
ArcMap|栅格计算器报错
2019-03-04
批量把多个csv/txt合成一个csv/txt
2019-03-04
《小石潭记》古文鉴赏
2019-03-04
Matlab中有关字符串数组的常见问题解答
2019-03-04
未定义的变量“py”或函数“py.command”
2019-03-04
我们,都一样......(句句入心)
2019-03-04
两个数求最大公约数和最小公倍数的方法和理解
2019-03-04
总结了一下c/c++函数和变量的命名规则
2019-03-04
关于构造函数内调用虚函数的问题
2019-03-04
最短路径问题—Dijkstra算法
2019-03-04
求二叉树的深度
2019-03-04
录音功能
2019-03-04
mysql时间相关函数和操作
2019-03-04
万物皆可爬系列查看翻页翻到最后是什么
2019-03-04
python scrapy
2019-03-04
pymongo的使用
2019-03-04
A Guide to Node.js Logging
2019-03-04
前端基础知识学习FreeCodeCamp
2019-03-04