Scala 3 only
用于类型,&
运算符创建一个所谓的_相交类型_。
A & B
类型表示同时是 A
类型和 B
类型两者的值。
例如,以下示例使用相交类型 Resettable & Growable[String]
:
trait Resettable:
def reset(): Unit
trait Growable[A]:
def add(a: A): Unit
def f(x: Resettable & Growable[String]): Unit =
x.reset()
x.add("first")
在本例中的方法 f
中,参数 x
必须同时既是 Resettable
也是 Growable[String]
。
相交类型 A & B
的_成员_既有 A
的所有成员,也有 B
的所有成员。
因此,如图所示,Resettable & Growable[String]
具有成员方法 reset
和 add
。
相交类型可用于_结构性_地描述需求。
也就是说,在我们的示例 f
中,我们直接表示只要 x
是 Resettable
和 Growable
的子类型的任意值, 我们就感到满意。
我们不需要创建一个_通用_的辅助 trait,如下所示:
trait Both[A] extends Resettable with Growable[A]
def f(x: Both[String]): Unit
trait Both[A] extends Resettable, Growable[A]
def f(x: Both[String]): Unit
定义 f
的两种选择之间有一个重要区别:虽然两者都允许使用 Both
的实例调用 f
,但只有前者允许传递属于 Resettable
和 Growable[String]
子类型的实例,后者 Both[String]
不允许。
请注意,
&
是_可交换的_:A & B
与B & A
的类型相同。
Contributors to this page:
Contents
- 导言
- Scala 3 特性
- 为什么是 Scala 3 ?
- Scala 的味道
- Hello, World!
- The REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 头等函数
- 单例对象
- 集合
- 上下文抽象
- 顶层定义
- 总结
- 类型初探
- 字符串插值
- 控制结构
- 领域建模
- 工具
- OOP 领域建模
- 函数式领域建模
- 方法
- 方法特性
- main 方法
- 总结
- 函数
- 匿名函数
- 函数变量
- Eta 扩展
- 高阶函数
- 自定义 map 函数
- 创建可以返回函数的方法
- 总结
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 总结
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数是值
- 函数式错误处理
- 总结
- 类型和类型系统
- 类型推断
- 泛型
- 相交类型
- 联合类型
- 代数数据类型
- 型变
- 不透明类型
- 结构化类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- Given 实例和 Using 语句
- 上下文绑定
- Given 导入
- 实现类型类
- 多元相等性
- 隐式转换
- 总结
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- worksheet
- 与 Java 交互
- 向 Java 开发者介绍Scala
- Scala for JavaScript Developers
- Scala for Python Developers
- 下一步去哪