`
侯上校
  • 浏览: 217129 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】Scala的协变和逆变

阅读更多
转自:http://my.oschina.net/scipio/blog/282794

 

一、概念

    协变和逆变是描述在集合中的多态关系与原来类型多态关系之间的关系。如果T1是T的子类,那么Container[T1]是不是Container[T]的子类呢?Variance注释允许你在类继承和多态类型之间表达下面的这些关系:

 * covariant(协变),[+T],C[T1]是 C[T]的子类

 * contravariant(逆变),[-T],C[T] 是 C[T1]的子类

 * invariant(不变),[T], C[T] 与 C[T1]不相关



●协变:covariance,将子类实例的容器赋值给基类容器的能力

● 逆变:contravariance,将超类实例的容器赋值给子类容器的能力



二、实例

1、方法里头的协变与逆变

package persia.demo
object Variance {
class Pet(val name: String){
override def toString()= name
}
class Dog(override val name: String) extends Pet(name)
def workWithPets(pets: Array[Pet]){}
/**
* 协变
* T<:Pet表示T所代表的类型派生自Pet
*/
def workWithPets2[T <: Pet](pets: Array[T]){
println("play with pets:"+pets.mkString(","))
}
/**
* 逆变
* D >:S 限定了destination目标类型D必须是Source源类型S的超类
*/
def copyPets[S,D >:S](fromDogs: Array[S],toPets: Array[D]){}
 
def main(args: Array[String]){
    //协变
    val dogs = Array(new Dog("dog1"),new Dog("dog2"))
    workWithPets2(dogs)
    //逆变
    val pets = new Array[Pet](10)
    copyPets(dogs,pets)
}
}


2、类里头的协变与逆变

package persia.demo
 
object ClassVar {
 
  def main(args: Array[String]): Unit = {
      /**
       * +T告诉scala允许协变,即
       * 在类型检查期间,让scala接收某个类型及其子类
       */
      class MyList[+T]
      var list1 = new MyList[Int]
      //不写类型,默认为MyList[Nothing]
      var list2: MyList[Any] = null
      list2 = list1
       
      /**
       * 告诉scala允许逆变
       * 即允许接收某个类型及其超类
       */
      class MyList2[-T]
      var list3 = new MyList2[Any]
      var list4: MyList2[Int] = null
      list4 = list3
  }
 
}

 

分享到:
评论

相关推荐

    scala课件.zip

    Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx ...泛型 上下界 视图界定 上下文界定 协变逆变不变.pptx AKKA.pptx 韩顺平_Scala语言核心编程.pdf

    Scala安装包和kafka安装包

    Scala以及kafka的安装包,Linux下的安装包,Scala2.11.4和kafka的2.92

    Scala函数式编程

    4 多态的具体化,尤其是协变的意义所在 5 各种重载的符号使用 之前读过 programming in scala,对语言的整体还停留在: 1 scala用起来比java更灵活 2 强大的collection,可以更加方便的处理collection类的数据 ...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    scala java 简体、繁体互转换,判断是否为简体、繁体

    可以用scala ,也可以用java,我主要的目的是用来判断汉字是否为繁体,

    scala sdk scala-2.12.3

    scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3

    Scala和设计模式.pdf

    下面Peter Norvig个例子就非常有代表性在有些语言中使用设计模式在使代码变得自然和简洁但是模式本身使 用方便性也很重要不妨让我们来看看Scala(种类似Ruby/Lisp的类语言它定程度上降低了模式实现繁琐)中常用 些模式...

    快学scala的习题和答案

    快学scala的习题和答案,对学习scala有巨大帮助,可以好好学习scala,在学习的过程中可以边看边练习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Scala数据结构和算法.docx

    Scala数据结构和算法

    面向Java开发人员Scala指南,Scala和servlet的比较

    面向Java开发人员Scala指南,Scala和servlet的比较 以及一些网上资料的整理,给大家分享分享!!!

    scala编程中文pdf

    scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...

    scala-sbt-scala编译工具

    scala 编译工具 sbt 安装包。 Little or no configuration required for simple projects Scala-based build definition that can use the full flexibility of Scala code Accurate incremental recompilation ...

    Scala编程实战.zip

    此文档是讲解实战Scala,...本书面向实际的使用场景,提供了大量的Scala实例,同时,也给出底层的原理和相关的参考。对于Scala新手来说这是一本不错的入门书,对于老手来说也是一本夯实基础,检视自己所学知识的好书。

    scala2.12.1Windows镜像包

    scala2.12.1Windows镜像包

    scala3 scala3 scala3 scala3 scala3

    scala3 scala3 scala3 scala3 scala3

    scala实战高清讲解

    scala编程进阶过程中不可或缺的书籍之一,详细介绍了scala语言的各种中高级语法,对于初学和高级开发人员有很大帮助

    scala 2.13.3 API 文档 Html离线版 scala-api.rar

    最新制作 scala 2.13.3 API 文档 Html离线版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。

    scala五本经典资料集合

    scala是一个经典的语言,Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。但是现在scala的相关学习资料不多,因此,本人总结了几篇写的较好的scala学习资料,包含&lt;ScalaQuery_Commerzbank_2011&gt;&lt;twitter-...

    最好的scala学习 课件

    最好的scala 学习课件,最好的scala 学习课件,学习spark必备

Global site tag (gtag.js) - Google Analytics