1. Upper bound和Lower bound

用 :> 声明 Lower bound,即父类约束, A :> B, A必须是B的父类

用 <: 声明 Upper bound, 即子类约束, A <: B  A必须是B的子类

Lower bound的例子

package ch6object Test4 {println("Welcome to the Scala worksheet")class A {type B >: List[Int]def foo(a: B) = a}val x = new A {type B = Traversable[Int]}Set(1)x.foo(Set(1))// val y = new A { type B = Set[Int]} // 编译错误
}

由此可见, A :> B的含义是: B的父类或与B有共同父类的类型

<:B通常不会用,因为它和 :B 的效果是一样的

2. 高阶类型

像高阶函数一样,有时一个类型需要另一个类型做参数。

 type Callback[T] = Function1[T, Unit]

3.type lambda

类似与lambda 表达式表示的函数, 类型也可以这样灵活地定义,下面给出一个例子,这个例子来自

stackOverflow: http://stackoverflow.com/questions/8736164/what-are-type-lambdas-in-scala-and-what-are-their-benefits

  trait Monad[M[_]] {def point[A](a: A): M[A]def bind[A, B](m: M[A])(f: A => M[B]): M[B]}class EitherMonad[A] extends Monad[({ type λ[α] = Either[A, α] })#λ] {def point[B](b: B): Either[A, B]def bind[B, C](m: Either[A, B])(f: B => Either[A, C]): Either[A, C]}

4.对于一个高阶类型A[T], A[T]的兼容性随T的具体类型的变化有三种情况

假设 S<: T

(1)invariant  <=>   A[S] 不兼容 A[T]

(2) covariant <=>   A[S] <: A[T]

(3) contravariant <=> A[T] <: A[S]

原文:

A higher-kinded type that’s invariant implies that for any types T, A, and B if T[A]  conforms to T[B] then A must be the equivalent type of B
T[A] conforms T[B]可以理解为 T[A]类型的引用可以赋给T[B]类型的对象

Covariance refers to the ability to substitute a type parameter with its parent type:
For any types T, A and B if T[A]  conforms to T[B]  then A <: B

5.mutable的类型必须是invariant的。 如Array

6.Function类型的参数类型,必须contraviriant的

package ch6object Test4 {println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheetdef foo(x: Any):String = "Hello, I received a "+ x//> foo: (x: Any)Stringdef bar(x: String): Any = foo(x)                //> bar: (x: String)Anybar("test")                                     //> res0: Any = Hello, I received a testfoo("test")                                     //> res1: String = Hello, I received a test
}

foo的类型为 Function1[Any, String]

bar的类型为 Function1[String, Any]

foo可以赋值给bar

转载于:https://blog.51cto.com/dingbo/1596743

Scala in depth 6 Scala的类型系统 中相关推荐

  1. Scala in depth 6 Scala的类型系统 上

    你见过这样的函数定义吗? def square[T : Numeric](n: T) = implicitly[Numeric[T]].times(n, n) 这篇博客将揭示Scala的类型系统的众多 ...

  2. Scala系列-3、scala中的类和对象有哪些?

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 如何使用IDEA创建scala项目 创建普通的scala项目 ...

  3. Scala系列-5、scala中的泛型、actor、akka

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 scala的 泛型 给方法定义泛型 给类定义泛型 泛型的上下 ...

  4. Scala系列-4、scala中特质、柯里化、闭包等

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 scala中特质 特质作为接口使用 特质中放置非抽象的成员 ...

  5. 面向 Java 开发人员的 Scala 指南: 深入了解 Scala 并发性

    http://www.ibm.com/developerworks/cn/java/j-scala04109.html http://www.ibm.com/developerworks/cn/jav ...

  6. Scala.js:将Scala编译为JavaScript的编译器

    Scala.js是一款将Scala代码编译为JavaScript代码的编译器,该编译器支持全部Scala语言特性.借助于Scala.js,开发者能够使用Scala开发从前端到后端的Web应用,而且Sc ...

  7. [原创]Scala学习:编写Scala脚本

    scala支持脚本 1)在/opt/scala-script下创建一个文件hello.scala 编辑内容如下: $ hello ,this is the first scala script 2)运 ...

  8. Scala go java_Java、Scala和Go语言多线程并发对比测试结果和结论

    AMD 双核 2.8G ,4G内存 winxp java+concjava+AKKA1.3java+AKKA2.0Scala+AKKA1.3Scala+AKKA2.0Go+goroutine 1-N ...

  9. 【Scala笔记——道】Scala 循环遍历 for详解

    Scala for循环 基本使用 增强型for循环 scala基本for循环如下,代码将names遍历并打印包含的名字. val names = Seq("Kitty", &quo ...

最新文章

  1. Java编程笔试时输入问题:如何输入固定长度、不定长度的一维数组?如何输入固定长度、不定长度的二维数组?
  2. 数组反向遍历ios_LeetCode106.从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inor...)...
  3. 分时线的9代表什么_为什么要打板?资深股民分享打板技巧和思路,句句精辟!...
  4. 百家中华老字号故宫过大年
  5. Python常见问题(7):Python图形用户接口 Graphic User Interface FAQ
  6. C语言头文件组织与包含原则
  7. 大学生体测成绩判断c语言_体育改革瞄准高校,体测不过关可能真的毕不了业了...
  8. 华科10年保送生计算机考研复试机试
  9. 深度学习经典算法 | 蚁群算法解析
  10. 从贝叶斯公式到垃圾邮件的识别
  11. UWP开发学习笔记3
  12. c语言如何引用一维数组,C语言一维数组的定义和引用
  13. 微信资源混淆AndResGuard原理
  14. 怎么把汉字转换成URL编码
  15. Auto CAD 批量转PDF、批量打印使用方法
  16. 软件下载页面php,PHP网页制作软件下载
  17. matlab2018在图片上添加文字并保存且图片没有白边
  18. 页面练习my blog day51
  19. D3.js-基础知识
  20. springboot 实现图片上传功能

热门文章

  1. H3C DHCP服务器显示及维护
  2. 2018-2019-2 网络对抗技术 20165320 Exp2 后门原理与实践
  3. python正则表达式match,search,find的使用方法
  4. 两种计算器小程序对比
  5. BZOJ 1071组队
  6. [Turn]C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
  7. [古诗十九首] 西北有高楼 —— 无名氏
  8. 5种不会被机器智能替代的能力
  9. 人工智能先驱 Nils Nilsson 去世,吴恩达、Yann LeCun 悼念
  10. c++十进制转二进制_二进制与十进制相互转换的原理