dotty编译器语法特性之一交叉类型,联合类型和文本单例类型
2019独角兽企业重金招聘Python工程师标准>>>
###翻译:http://dotty.epfl.ch/docs/reference/intersection-types.html #交叉类型
trait Resettable {def reset(): this.type
}
trait Growable[T] {def add(x: T): this.type
}
def f(x: Resettable & Growable[String]) = {x.reset()x.add("first")
}
这里x要求必须是Resettable
类型和Growable[T]
类型,交叉类型A & B
替代了scala2中的复合类型A with B
(目前,这种复合类型仍然可以使用,但是未来会被废除)
与 with
复合类型不同,&
交叉类型是可互换的,比如:A & B
和B & A
是相同的类型。 一个交叉类型A & B
的所有成员,是类型A
的所有成员和类型B
的所有成员之和。
例如Resettable & Growable[String]
类型拥有reset
和add
两个分别来自两个类型的成员方法。
如果一个成员既出现在A
类型中,又出现在B
类型中,那么这个成员的类型在类型A & B
中表现为A
类型和B
类型交叉。比如下面的例子:
trait A {def children: List[A]def say:Int = 1
}
trait B {def children: List[B]def say:String = "2"
}
class C extends A with B {def children: List[A & B] = List(new C)override def say:Int & String = super.say + 3}
val x: A & B = new C
val xs: List[A] & List[B] = x.children
val ys: List[A & B] = x.children
这个成员children
在 A & B
的类型,是 children
在A
中的类型List[A]
和children
在B
中类型List[B]
的交叉类型List[A] & List[B]
。这个能进一步简化为List[A & B]
,因为List
是协变的。
联合类型
翻译:http://dotty.epfl.ch/docs/reference/union-types.html
操作符|
创建一个联合类型
case class UserName(name: String) {def lookup(admin: Admin): UserData
}
case class Password(hash: Hash) {def lookup(admin: Admin): UserData
}def help(id: UserName | PassWord) = {val user = id match {case UserName(name) => lookupName(name)case Password(hash) => lookupPassword(hash)}// ...
}
联合类型是双重交叉类型。联合类型A|B
的值是所有A
的值和所有B
的值之和。 |
联合类型是可互换的,比如:A | B
和B | A
是相同的类型。
只有当一个表达式明确给出类型的时候,编译器才会给这个表达式赋值一个联合类型,例如:
scala> val password = Password(123)
val password: Password = Password(123)
scala> val name = UserName("Eve")
val name: UserName = UserName(Eve)
scala> if (true) name else password
val res2: Object & Product = UserName(Eve)
scala> val either: Password | UserName = if (true) name else password
val either: Password | UserName = UserName(Eve)
scala>help(either)
res2
的类型是Object & Product
,它是 UserName
和 Product
的一个超类,但不是类型的最小超类Password | UserName
。如果想获得最小超类,必须明确给出类型定义,就像这里的val either: Password | UserName
的类型。要调用联合类型的成员,使用类型匹配match
,比如这里的help
方法
#文本单例类型 看以下例子:
object Literals{val fortyTwo: 42 = 42val `2`: 2 = 2val fortyFour: 44 = fortyTwo + `2`val text: "text" = "text"def id[T](a: T) = aval two: 2 = id(`2`)final val T = 1
val x: T.type = 2 // error , 2 should be 1
}
这里 val x: T.type = 2
会报错,因为T.type
文本类型只能赋值为原本定义的值,这里是1
。这里的final val
定义个值不可变的单例文本类型,使用T.type
来引用,且只能赋值为原值。
转载于:https://my.oschina.net/jackywyz/blog/913099
dotty编译器语法特性之一交叉类型,联合类型和文本单例类型相关推荐
- dotty编译器语法特性之一幽灵类型
2019独角兽企业重金招聘Python工程师标准>>> 什么是幽灵类型? 一个幽灵类型是在运行时表现为没有副作用的抽象类型. 因为他们在运行时没有副作用,所以一旦它显示明确类型之后, ...
- dotty编译器语法特性之一枚举类型
2019独角兽企业重金招聘Python工程师标准>>> 一个枚举是用来定义一个类型,这个类型是命名值类型的集合. 翻译: http://dotty.epfl.ch/docs/refe ...
- dotty编译器语法特性之一λ类型和隐式函数类型
2019独角兽企业重金招聘Python工程师标准>>> λ类型 λ类型是让一个表达式不需要定义,就直接转为一个高阶类型. [+X, Y] => Map[Y, X] 比如以上,类 ...
- 【PHP】PHP 8.1 的新特性一览 | 交叉类型、枚举、never 返回类型、Fibers 纤程、readonly 只读属性
目录 一.前言 二.PHP 8.1 新特性 纯交叉类型 Pure Intersection Types 枚举 Enums `never` 返回类型 Fibers 纤程 readonly 只读属性 三. ...
- c++ 14新的语法特性之返回类型推导
c++ 14新的语法特性之返回类型推导 一.返回类型推导 返回类型推导 即编译器会在运行期间,推导出该函数方法的返回类型,不过应该也会存在问题,比如返回类型不同的时候,所以这个特性 还是谨慎使用比较好 ...
- 代码健壮性的获得 —— 借助编译器及语言的语法特性
1. 借助编译器 主要利用编译器对语法中一些关键字.修饰符的支持: Java final.static 注意区分 Java 的按值传递和按引用传递,但使用按引用传递时,被调端不会对(没有能力)对调用端 ...
- C++基础::语法特性::函数重写(override)与协变返回类型(covariant return type)
函数重写 在进行本文的协变返回类型(covariant return type)的讨论之前,不妨先重新温故C++关于函数重写的语法规则.协变返回类型与函数重写有着千丝万缕的联系. 首先明确函数重载(o ...
- Flutter学习之Dart语法特性
一.前言 第一天把Flutter环境搭建了,并简单实现第运行第一个Flutter项目,感觉很不错,一些基本操作和原生体验差不多.用Flutter框架写过App项目的开发者都知道,Flutter是一个使 ...
- Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?
Java语法变化 Java5(2004): 枚举.泛型.注解.封箱(解箱)- Java6(2006): @Override接口 Java7(2011): Diamond语法.多Catch.Try- J ...
最新文章
- 微生物组-扩增子16S分析研讨会(2020.1)
- 话里话外:论持续跟踪和及时反馈
- (原创)datagrid数据导出到excel文件给客户端下载的几种方法
- 【Linux】43.ubuntu18.04安装搜狗输入法不能正常使用
- 图像检索:再叙ANN Search
- 用SI 和 DI实现字符串的复制
- ORACLE TEXT LEXER PREFERENCE(二)
- 记对一个key file crackme的破解
- c语言iso校验算法,模式识别c语言ISODATA算法.doc
- centos 7 mysql 源码安装,CentOS 7源码安装MYSQL
- 水洗唛标签打印机怎么选择
- ThinkPHP5小区物业管理系统
- canvas设计抽奖刮刮卡(非酋慎点) - Kaiqisan
- 杨歌:金融电路与 Web3 经济模型原理
- 80C51单片机:2.初学点亮发光二极管,流水灯案例
- 从Eclipse官网查找自己要的插件地址 来安装
- 2022年自考专业考试(计算机应用)计算机系统结构练习题
- RabbitMQ 安装教程(CentOS版)
- JavaScript中基本数据类型的强制转换
- 3、HTTP请求头与响应头
热门文章
- Java jpa 字段限制_Java-JPA:仅更新特定字段
- Tomcat6.0.37,tomcat6.0.37,下访问Web项目,jsp项目不需要输入项目名称和端口号的配置方法...
- leetcode179. 最大数
- 广义表的基本概念【数据结构】
- (十三)nodejs循序渐进-高性能游戏服务器框架pomelo之扩展聊天服务器为机器人自动聊天
- C++ 标准程序库std::string 详解
- codeforces 282A-C语言解题报告
- 是什么摧毁了程序员的工作效率
- Junit Test使用样例
- 需求规格说明书1.0