Scala语言:既存类型

Scala既存类型语法:

既存类型具有 T forSome {Q}的形式,Q 是一个类型声明的序列。设t1[tps1]>:L1<:U1,...,tn[tpsn]>:Ln<:Un 是 Q 中声明的类型(任何类型参数部分[tpsi]都可以没有)。每个类型 ti 的域都包含类型 T 和既存子句 Q。类型变量 ti 就称为在类型 T forSome {Q}中被绑定。在 T 中但是没被绑定的类型变量就被称为在 T 中是自由的。

T forSome {Q}的类的实例就是类 σT,σ 是 t1,...,tn 上的迭代,对于每一个 i,都有 σLi<:σti<:σUi。既存类型 T forSome{Q}的值的集合就是所有其类型实例值的集合的合集。

T forSome {Q}的斯科伦化是一个类实例 σT,σ 是[t‟

1/t1,..., t‟n/tn上的迭代,每个 t‟是介于 σLi和 σUi 间的新的抽象类型

简化规则

既存类型遵循以下四个等效原则:

  1. 既存类型中的多个 for 子句可以合并。例 T forSome {Q} forSome{Q‟}等价于 T forSome {Q;Q‟}
  2. 未使用的限定可以去掉。例:T forSome {Q;Q‟},但是 Q‟中定义的类型没有被 T 或 Q 引用,那么该表达式可等价为 T forSome {Q}
  3. 空的限定可以丢弃。例:T forSome{}等价于 T。
  4. 一个既存类型 T forSome {Q},Q 中包含一个子句 type t[tps] >: L <: U 等价于类型 T‟ forSome {Q},T‟是将 T 中所有 t 的协变量替换为 U 并且将T 中所有的 t 的逆变量替换为 L 的结果。

在值上的既存量化

为了语法上的方便,在既存类型上的绑定子句可以包括值声明 val x: T。既存类型T forSome { Q; val x: S; Q‟} 是 T‟ forSome { Q; type t <: S withSingleton; Q‟}的简写形式,此处 t 是一个新的类型名,T‟是将 T 中所有 x.type 用t 代替的结果

既存类型的占位符语法

语法:

WildcardType ::= „_‟ TypeBoundsScala 支持既存类型的占位符语法。通配符类型的形式为 _>:L<:U。两个边界均可忽略。如果下界>:L 被忽略则>:scala.Nothing。如果上界<:U 被忽略则用<:scala.Any。通配符类型是既存限定类型变量的简写,既存的限定条件是内涵的。

通配符类型只能作为参数化类型的类型参量出现。设 T=p.c[targs,T,tags‟]是一个参数化类型,targs,targs‟可以为空,T 是一个通配符类型_>:L<:U。那么 T 等价于

以下既存类型:

p.c[tags,t,tags‟] forSome { type t >:L<:U}t 是一个新的类型变量。通配符类型可以作为中缀类型,函数类型或元组类型的一部分出现。它们的扩展也就是等价参数化类型的扩展

列表中的后两个类型是等价的。使用通配符语法的另一种形式是:

Ref[_ <: java.lang.Number]

Ref[(_ <: Outer with Singleton)# T]

示例 3.2.6 类型 List[List[_]]等价于既存类型:

List[List[t] forSome { type t }]

示例 3.2.7 假定有协变类型:

class List[+T]

类型:

List[T] forSome { type T <: java.lang.Number }

应用上面的第四条简化规则,上式等价于:

List[java.lang.Number] forSome { type T <: java.lang.Number }

如果再应用上面的第二和第三条简化规则,上式可化为:

List[java.lang.Number]

原文发布于微信公众号 - 加米谷大数据(DtinoneBD)

原文发表时间:2018-03-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java工会

Java基础第二阶段知识点,招初级java的面试官都在问这些

1564
来自专栏阿凯的Excel

Python读书笔记7(列表-改增删)

上期和大家分享了列表的创建及列表的基本特性,本期和大家分享一下列表改增删操作。 一、列表的修改 ? 上期的这个图还记得吗? 这个图说明了字符串的不可变性及列...

3624
来自专栏专注 Java 基础分享

java基础之继承(二)

上篇我们介绍了java中的构造方法,了解了关键字this和super在继承中所起到的作用,this可以显式调用重载的构造方法,super可以显式的调用父类中的任...

2068
来自专栏张善友的专栏

C# 内部类

        C#中的内部类能够使用外部类定义的类型和静态方法,但是不能直接使用外部类的实例方法,直接看来,外部类对于内部类的作用更像是一个命名空间,在C#中...

2318
来自专栏java工会

Java基础第二阶段知识点,招初级java的面试官都在问这些

JDK:是java开发的工具箱,包含jre,还包含将java文件编译为class文件的javac工具类(编译器),除此之外还包括java原生的API;包含J2S...

1301
来自专栏Java帮帮-微信公众号-技术文章全总结

数据结构基础(1) --Swap ; Bubble-Sort ; Select-Sort

Swap的简单实现 //C语言方式(by-pointer): template <typename Type> bool swapByPointer(T...

3538
来自专栏数据结构与算法

1013. 识别三角形

1013. 识别三角形 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB  具体限制  题目描述 输入三个正整数,判断...

3333
来自专栏WD学习记录

Python数据结构与算法笔记(2)

栈、队列、deques、列表是一类数据的容器,它们数据项之间的顺序由添加或删除的顺序决定。一旦一个数据项被添加,它相对于前后元素一直保持该位置不变。诸如此类的数...

1051
来自专栏程序员互动联盟

【专业技术】C++虚函数的缺省参数

编者按:缺省参数,缺省函数,缺省构造函数,如果你有些迷糊,本文可以让你把它看个清楚。呵呵。 前些日子,有个同学问我一个关于虚函数的缺省参数问题。他是从某个论坛上...

2926
来自专栏mathor

异常的捕获与处理

1712

扫码关注云+社区

领取腾讯云代金券