博客
关于我
scala上界与下界、协变与逆变
阅读量:331 次
发布时间: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/

你可能感兴趣的文章
随机四则运算
查看>>
Maven
查看>>
Java重载overload
查看>>
Java面向对象
查看>>
JAVA带标签的break和continue
查看>>
Java_File类的基本用法
查看>>
Java获取线程基本信息的方法
查看>>
JavaWeb用户信息管理系统-创建登录业的务持久层
查看>>
SpringIoC和DI注解开发
查看>>
Java类和对象
查看>>
Java集合Collection
查看>>
SpringMVC入门-概述和基本配置
查看>>
SpringBoot快速入门
查看>>
医疗管理系统-手机快速登录和SpringSecurity权限控制
查看>>
SpringCloud微服务简介
查看>>
网页实现微信登录
查看>>
vue源码分析(MVVM篇)
查看>>
vue源码分析(observe篇)
查看>>
ElasticSearch 快照备份和还原
查看>>
React(八)- ReactUI组件库及Redux的使用
查看>>