• 类型关系

    Scala 支持在泛型类上使用型变注释,用来表示复杂类型、组合类型的子类型关系间的相关性

    • 协变 +T,变化方向相同,通常用在生产

      假设 A extends T, 对于 Clazz[+T],则 Clazz[A] 也可看做 Clazz[T]

      // 官网示例
      abstract class Animal {
      def name: String
      }
      case class Cat(name: String) extends Animal
      case class Dog(name: String) extends Animal

      由于 Scala 标准库中不可变 List 的定义为 List[+A],因此 List[Cat]List[Animal] 的子类型, List[Dog] 也是 List[Animal] 的子类型,所以可直接将他们当作 List[Animal] 使用。

      // 官网示例
      object CovarianceTest extends App {
      def printAnimalNames(animals: List[Animal]): Unit = {
      animals.foreach { animal =>
      println(animal.name)
      }
      } val cats: List[Cat] = List(Cat("Whiskers"), Cat("Tom"))
      val dogs: List[Dog] = List(Dog("Fido"), Dog("Rex")) printAnimalNames(cats)
      // Whiskers
      // Tom printAnimalNames(dogs)
      // Fido
      // Rex
      }
    • 逆变 -T,变化方向相反,通常用在消费

      假设 A extends T, 对于 Clazz[-T],则 Clazz[T] 也可看做 Clazz[A]

      // 官网示例
      abstract class Printer[-A] {
      def print(value: A): Unit
      } class AnimalPrinter extends Printer[Animal] {
      def print(animal: Animal): Unit =
      println("The animal's name is: " + animal.name)
      } class CatPrinter extends Printer[Cat] {
      def print(cat: Cat): Unit =
      println("The cat's name is: " + cat.name)
      } object ContravarianceTest extends App {
      val myCat: Cat = Cat("Boots") def printMyCat(printer: Printer[Cat]): Unit = {
      printer.print(myCat)
      } val catPrinter: Printer[Cat] = new CatPrinter
      val animalPrinter: Printer[Animal] = new AnimalPrinter printMyCat(catPrinter)
      printMyCat(animalPrinter) // 将 Printer[Animal] 当作 Printer[Cat] 使用
      }

Scala Type Parameters 2的更多相关文章

  1. Scala Type Parameters 1

    类型参数 表现形式:在名称后面以方括号表示, Array[T] 何处使用 class 中,用于定义变量.入参.返回值 class Pair[T, S](val first: T, val second ...

  2. Beginning Scala study note(8) Scala Type System

    1. Unified Type System Scala has a unified type system, enclosed by the type Any at the top of the h ...

  3. type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object

    今天在进行代码检查的时候出现下面的异常: type parameters of <T>T cannot be determined; no unique maximal instance ...

  4. Java Error : type parameters of <T>T cannot be determined during Maven Install

    遇到了一个问题如下: Caused by the combination of generics and autoboxing. 这是由于泛型和自动装箱联合使用引起的. 可以查看以下两个回答:   1 ...

  5. learning scala type alise

    How to use type alias to name a Tuple2 pair into a domain type called CartItem type CartItem[Donut, ...

  6. learning scala repreated parameters

  7. Scala 深入浅出实战经典 第78讲:Type与Class实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  8. scala类型系统 type关键字

    和c里的type有点像. scala里的类型,除了在定义class,trait,object时会产生类型,还可以通过type关键字来声明类型. type相当于声明一个类型别名: scala> t ...

  9. Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag

    反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...

随机推荐

  1. CDH报错:ScmActive at bootup: Failed to validate the identity of Cloudera Manager.

    报错原因以及解决办法在官网: https://www.cloudera.com/documentation/enterprise/5-8-x/topics/cm_failover_db.html 1. ...

  2. HP服务器重装centeos 6.3红屏错误码 Illegal Opcode

    公司组装一个服务器要装centos 6.3 .出现一个问题 如果自动引导一切正常.如果手动分区重启后就会,红屏错误码 Illegal Opcode. 去网上问度娘各种不靠谱,有时说要 升级BIOS,从 ...

  3. ansible自动化运维02

    ansible清单管理 inventory文件通常用于定义要管理主机的认证信息,例如:ssh登录用户名,密码,以及key相关信息. 举个例子:定义清单组 注意:组名为pro,关键字段children表 ...

  4. Ajax请求设置csrf_token

    方式1 通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送. $.ajax({ url: "/cookie_ajax/", type: ...

  5. 02-linux-换源-ui方式

    换软件源 使用清华的软件源. Ubuntu 的 ui 界面操作^换源 System setting -> Software & update -> Download from -& ...

  6. ubuntu使用anaconda安装tensorflow

    https://blog.csdn.net/shiheyingzhe/article/details/80863422 https://blog.csdn.net/sheyanshangjiang/a ...

  7. 第二阶段冲刺(个人)——seven

    今天的计划:设计总的界面背景,统一风格. 昨天做了什么?优化登录.注册信息的填写判断.

  8. 第二阶段冲刺(个人)——five

    今天的计划:优化登录.注册信息的填写判断. 昨天做了什么?做背景. 困难:无

  9. hdu5285-wyh2000 and pupil-(染色法二分图判定)

    http://acm.hdu.edu.cn/showproblem.php?pid=5285 题意:把互不认识的人分到两个组,第一组人数尽可能多. 题解:把互不认识的人连起来,当作二分图,二分图可能有 ...

  10. java类uuid源码分析

    通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份.UUID的目的,是让分散式系统 ...