首页 > 解决方案 > scala中的复合类型与mixins

问题描述

准备在编程 scala 第 2 版中介绍复合类型,留下的问题多于答案。

当您声明一个组合了多种类型的实例时,您将获得一个复合类型:

trait T1
trait T2
class C
val c = new C with T1 with T2  // c's type: C with T1 with T2

在这种情况下,类型cC with T1 with T2。这是声明扩展C和混合在T1and中的类型的替代方法T2。请注意,它c被视为所有三种类型的子类型:

val t1: T1 = c
val t2: T2 = c
val c2: C  = c

想到的问题是,为什么要替代?如果你在一种语言中添加一些东西,它应该会增加一些价值,否则它是无用的。因此,复合类型的附加值是什么,它与 mixins 相比如何,即扩展 ... 与 ...

标签: scalainheritancetypesmixinscompound-type

解决方案


Mixin 和复合类型是不同的概念:

https://docs.scala-lang.org/tour/mixin-class-composition.html

对比

https://docs.scala-lang.org/tour/compound-types.html

Mixin 是 trait

trait T1
trait T2
class C
class D extends C with T1 with T2
val c = new D

部分情况是匿名类代替D

trait T1
trait T2
class C
val c = new C with T1 with T2 // (*)

复合类型是类型

type T = Int with String with A with B with C

in (*) 的类型c是复合类型。

mixin 的概念来自类、继承、OOP 等领域。复合类型的概念来自类型、子类型、类型系统、类型理论等领域。


“在 Scala 中编程”的作者的意思是有一个替代方案:

  • 要么介绍D

    (然后D扩展两个mixin,即T1and T2,类型为cis D

  • 或不

    (要使用匿名类而不是D,类型c是复合类型)。


推荐阅读