Scala中的化合物类型与Mixins

问题描述

在scala第二版编程中读到复合类型,剩下的问题多于答案。

声明一个包含多个类型的实例时,您将获得一个复合类型:

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

在这种情况下,c的类型为C with T1 with T2。这是声明扩展C并混合使用T1T2的类型的替代方法。请注意,c被认为是所有三种类型的子类型:

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

浮现在脑海中的问题是,为什么要选择替代品?如果您在语言中添加一些内容,那么它应该会增加一些价值,否则就没有用了。因此,化合物类型的附加值是什么?它与混合蛋白的比较如何,即使用...

扩展...

解决方法

Mixin和化合物类型是不同的概念

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

vs。

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

杂种是特质

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

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

mixin的概念来自类,继承,OOP等世界。复合类型的概念来自类型,子类型,类型系统,类型理论等世界。


“在Scala中编程”的作者表示有另一种选择:

  • 要么介绍D

    (然后D扩展了两个混合,即T1T2c的类型为D

  • 还是不

    (要使用匿名类代替Dc的类型是复合类型)。