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 & BB & A是相同的类型。 一个交叉类型A & B的所有成员,是类型A的所有成员和类型B的所有成员之和。

例如Resettable & Growable[String]类型拥有resetadd两个分别来自两个类型的成员方法。

如果一个成员既出现在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

这个成员childrenA & B的类型,是 childrenA中的类型List[A]childrenB中类型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 | BB | 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,它是 UserNameProduct的一个超类,但不是类型的最小超类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编译器语法特性之一交叉类型,联合类型和文本单例类型相关推荐

  1. dotty编译器语法特性之一幽灵类型

    2019独角兽企业重金招聘Python工程师标准>>> 什么是幽灵类型? 一个幽灵类型是在运行时表现为没有副作用的抽象类型. 因为他们在运行时没有副作用,所以一旦它显示明确类型之后, ...

  2. dotty编译器语法特性之一枚举类型

    2019独角兽企业重金招聘Python工程师标准>>> 一个枚举是用来定义一个类型,这个类型是命名值类型的集合. 翻译: http://dotty.epfl.ch/docs/refe ...

  3. dotty编译器语法特性之一λ类型和隐式函数类型

    2019独角兽企业重金招聘Python工程师标准>>> λ类型 λ类型是让一个表达式不需要定义,就直接转为一个高阶类型. [+X, Y] => Map[Y, X] 比如以上,类 ...

  4. 【PHP】PHP 8.1 的新特性一览 | 交叉类型、枚举、never 返回类型、Fibers 纤程、readonly 只读属性

    目录 一.前言 二.PHP 8.1 新特性 纯交叉类型 Pure Intersection Types 枚举 Enums `never` 返回类型 Fibers 纤程 readonly 只读属性 三. ...

  5. c++ 14新的语法特性之返回类型推导

    c++ 14新的语法特性之返回类型推导 一.返回类型推导 返回类型推导 即编译器会在运行期间,推导出该函数方法的返回类型,不过应该也会存在问题,比如返回类型不同的时候,所以这个特性 还是谨慎使用比较好 ...

  6. 代码健壮性的获得 —— 借助编译器及语言的语法特性

    1. 借助编译器 主要利用编译器对语法中一些关键字.修饰符的支持: Java final.static 注意区分 Java 的按值传递和按引用传递,但使用按引用传递时,被调端不会对(没有能力)对调用端 ...

  7. C++基础::语法特性::函数重写(override)与协变返回类型(covariant return type)

    函数重写 在进行本文的协变返回类型(covariant return type)的讨论之前,不妨先重新温故C++关于函数重写的语法规则.协变返回类型与函数重写有着千丝万缕的联系. 首先明确函数重载(o ...

  8. Flutter学习之Dart语法特性

    一.前言 第一天把Flutter环境搭建了,并简单实现第运行第一个Flutter项目,感觉很不错,一些基本操作和原生体验差不多.用Flutter框架写过App项目的开发者都知道,Flutter是一个使 ...

  9. Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?

    Java语法变化 Java5(2004): 枚举.泛型.注解.封箱(解箱)- Java6(2006): @Override接口 Java7(2011): Diamond语法.多Catch.Try- J ...

最新文章

  1. 微生物组-扩增子16S分析研讨会(2020.1)
  2. 话里话外:论持续跟踪和及时反馈
  3. (原创)datagrid数据导出到excel文件给客户端下载的几种方法
  4. 【Linux】43.ubuntu18.04安装搜狗输入法不能正常使用
  5. 图像检索:再叙ANN Search
  6. 用SI 和 DI实现字符串的复制
  7. ORACLE TEXT LEXER PREFERENCE(二)
  8. 记对一个key file crackme的破解
  9. c语言iso校验算法,模式识别c语言ISODATA算法.doc
  10. centos 7 mysql 源码安装,CentOS 7源码安装MYSQL
  11. 水洗唛标签打印机怎么选择
  12. ThinkPHP5小区物业管理系统
  13. canvas设计抽奖刮刮卡(非酋慎点) - Kaiqisan
  14. 杨歌:金融电路与 Web3 经济模型原理
  15. 80C51单片机:2.初学点亮发光二极管,流水灯案例
  16. 从Eclipse官网查找自己要的插件地址 来安装
  17. 2022年自考专业考试(计算机应用)计算机系统结构练习题
  18. RabbitMQ 安装教程(CentOS版)
  19. JavaScript中基本数据类型的强制转换
  20. 3、HTTP请求头与响应头

热门文章

  1. Java jpa 字段限制_Java-JPA:仅更新特定字段
  2. Tomcat6.0.37,tomcat6.0.37,下访问Web项目,jsp项目不需要输入项目名称和端口号的配置方法...
  3. leetcode179. 最大数
  4. 广义表的基本概念【数据结构】
  5. (十三)nodejs循序渐进-高性能游戏服务器框架pomelo之扩展聊天服务器为机器人自动聊天
  6. C++ 标准程序库std::string 详解
  7. codeforces 282A-C语言解题报告
  8. 是什么摧毁了程序员的工作效率
  9. Junit Test使用样例
  10. 需求规格说明书1.0