Scala in depth 6 Scala的类型系统 中
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的类型系统 中相关推荐
- Scala in depth 6 Scala的类型系统 上
你见过这样的函数定义吗? def square[T : Numeric](n: T) = implicitly[Numeric[T]].times(n, n) 这篇博客将揭示Scala的类型系统的众多 ...
- Scala系列-3、scala中的类和对象有哪些?
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 如何使用IDEA创建scala项目 创建普通的scala项目 ...
- Scala系列-5、scala中的泛型、actor、akka
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 scala的 泛型 给方法定义泛型 给类定义泛型 泛型的上下 ...
- Scala系列-4、scala中特质、柯里化、闭包等
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 scala中特质 特质作为接口使用 特质中放置非抽象的成员 ...
- 面向 Java 开发人员的 Scala 指南: 深入了解 Scala 并发性
http://www.ibm.com/developerworks/cn/java/j-scala04109.html http://www.ibm.com/developerworks/cn/jav ...
- Scala.js:将Scala编译为JavaScript的编译器
Scala.js是一款将Scala代码编译为JavaScript代码的编译器,该编译器支持全部Scala语言特性.借助于Scala.js,开发者能够使用Scala开发从前端到后端的Web应用,而且Sc ...
- [原创]Scala学习:编写Scala脚本
scala支持脚本 1)在/opt/scala-script下创建一个文件hello.scala 编辑内容如下: $ hello ,this is the first scala script 2)运 ...
- Scala go java_Java、Scala和Go语言多线程并发对比测试结果和结论
AMD 双核 2.8G ,4G内存 winxp java+concjava+AKKA1.3java+AKKA2.0Scala+AKKA1.3Scala+AKKA2.0Go+goroutine 1-N ...
- 【Scala笔记——道】Scala 循环遍历 for详解
Scala for循环 基本使用 增强型for循环 scala基本for循环如下,代码将names遍历并打印包含的名字. val names = Seq("Kitty", &quo ...
最新文章
- Java编程笔试时输入问题:如何输入固定长度、不定长度的一维数组?如何输入固定长度、不定长度的二维数组?
- 数组反向遍历ios_LeetCode106.从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inor...)...
- 分时线的9代表什么_为什么要打板?资深股民分享打板技巧和思路,句句精辟!...
- 百家中华老字号故宫过大年
- Python常见问题(7):Python图形用户接口 Graphic User Interface FAQ
- C语言头文件组织与包含原则
- 大学生体测成绩判断c语言_体育改革瞄准高校,体测不过关可能真的毕不了业了...
- 华科10年保送生计算机考研复试机试
- 深度学习经典算法 | 蚁群算法解析
- 从贝叶斯公式到垃圾邮件的识别
- UWP开发学习笔记3
- c语言如何引用一维数组,C语言一维数组的定义和引用
- 微信资源混淆AndResGuard原理
- 怎么把汉字转换成URL编码
- Auto CAD 批量转PDF、批量打印使用方法
- 软件下载页面php,PHP网页制作软件下载
- matlab2018在图片上添加文字并保存且图片没有白边
- 页面练习my blog day51
- D3.js-基础知识
- springboot 实现图片上传功能