`
侯上校
  • 浏览: 223490 次
  • 性别: 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语言分析报告

    它还引入了型变注释,使得类型继承结构更加灵活,能够处理协变和逆变。此外,Scala支持上限和下限类型边界,使得类型继承结构更精确,同时也支持类和抽象类型的对象成员,复合类型以及显式自类型和视图绑定,增强了...

    Programming In Scala 中文版及英文版

    15. **类型系统高级特性**:包括类型参数的上下界、协变和逆变、路径依赖类型等,使得Scala能够实现复杂的类型系统设计。 总之,《Programming In Scala》中文版和英文版覆盖了Scala语言的核心概念和高级特性,无论...

    scala详细介绍_word_带索引_非扫描版

    Scala的类型系统是静态的,提供了**泛型**、**协变和逆变**、**类型标注**、**类型参数约束**等功能,确保了代码的类型安全性和一致性。此外,它支持**复合类型**、**显式类型指定**以及**视图**,增强了类型表达的...

    scala课件.zip

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

    【学习 Scala】.pdf

    它支持泛型、协变和逆变、类型参数的上下界约束,以及将类别和抽象类型作为对象成员。 4. **复合类型**:Scala允许创建复合类型,比如元组,可以组合多种类型的值。 5. **类型推断**:Scala具有类型推断能力,使得...

    Scala By Example

    书中涵盖了类型参数的边界、协变与逆变、下界约束以及最小子类型的概念。 10. **列表**:Scala的列表是不可变的,支持多种操作,如头部、尾部、映射、过滤等。列表的使用是Scala编程中的常见场景。 总的来说,...

    最全programming in scala

    5. **泛型类型和方法**:书中深入讨论了泛型在Scala中的应用,包括类型参数边界、协变和逆变注解、下界、最小类型、元组和函数类型。掌握泛型有助于编写更加通用和灵活的代码。 6. **列表操作**:Scala的列表是一种...

    Swift和Scala语法的比较

    不过Scala的类型系统更加强大和复杂,支持协变、逆变等概念。 Swift的子脚本语法允许通过指定索引来访问对象,使用get和set关键字定义读写访问器。Scala则使用`def`和`def_=`定义子脚本的获取和设置方法。 总结: ...

    scala handbook

    - 面向对象编程(OOP):了解类、特质(trait)、协变和逆变的概念。 在更高级的话题中,Scala提供了对并发编程的支持,如actor模型、消息传递机制和软件事务内存(STM)。此外,Scala还拥有丰富的库支持,比如util...

    Programming in Scala

    类型参数边界确保了泛型方法和类的正确性,而协变和逆变注解则控制了泛型类型在多态中的行为。最小子类型和元组提供了灵活的数据组合方式,而函数也被视为一等公民,可以作为参数或返回值。 列表是Scala中常用的...

    快学scala第一章习题答案.doc

    Scala 语言具有一个强大的类型系统,支持多种类型系统概念,如参数多态、协变和逆变等。Scala 语言还提供了许多高级类型系统概念,如类型推断、类型参数等。 十二、Scala 中的集合框架 Scala 语言提供了一个强大的...

    Scala By Examples

    这里会讲解类型参数的边界、协变和逆变的概念,以及如何使用最小子类型和元组。 最后,"Lists"章节介绍了Scala的列表数据结构及其操作,如遍历、转换和组合,这些都是处理序列数据时不可或缺的工具。 总的来说,...

    Scala By Example(2009_5)

    `variance annotations`控制泛型类型的协变和逆变,影响类型兼容性。最小子类型和元组也是泛型应用的一部分,函数和列表等也支持泛型。 8. **列表**: 列表是Scala中常用的数据结构,支持链式存储和多种操作,如...

    快学 scala 中文版 带完整目录

    18.10 协变和逆变点 305 18.11 对象不能泛型 307 18.12 类型通配符 308 练习 309 第19章 高级类型 L2 313 19.1 单例类型 313 19.2 类型投影 315 19.3 路径 316 19.4 类型别名 317 19.5 结构类型 318 19.6 ...

    Effective Scala中文版

    - **变型**: 明确泛型类型时的协变和逆变。 - **类型别名**: 为复杂的类型创建简短的别名可以提高代码的清晰度。 - **隐式转换**: 谨慎使用隐式转换,因为过度使用会导致代码的不可预测性和复杂性增加。 #### 集合 ...

    Scala by example

    - 变异性注解(Covariance和Contravariance):控制泛型类型的协变和逆变,影响类型安全和多态性。 - 最小类型:用于类型推断,确保最小限制的类型匹配。 - 元组:可以组合不同类型的值,形成一个单一的复合值。 ...

    Scala编程详解 第19讲-Scala编程详解:类型参数 共13页.pptx

    - 协变和逆变:类型参数可以标记为协变covariant(+T)或逆变contravariant(-T),影响类型参数在多态中的行为。 - Existential Types:用于处理类型参数的“存在”信息,通常在类型系统复杂的情况下使用。 掌握...

    Scala By Example 2014.11

    Variance注解(如`+`和`-`)用来控制泛型的协变和逆变,影响到集合操作时的类型安全。例如,`List[+A]`表示列表是协变的,意味着如果`A`是`B`的子类型,那么`List[A]`也是`List[B]`的子类型。 此外,Scala还支持...

    Scala 高级编程及实例

    - **方差注解**:解释了方差注解(协变与逆变)的概念及其在Scala中的应用。 - **下界**:介绍了一种设置类型参数最小值的方式。 - **最小子类型**:进一步探讨了如何确定类型的最小子类型。 - **元组**:讲述了元组...

Global site tag (gtag.js) - Google Analytics