自类型和特质子类之间有什么区别?

421

一个用于特质A的自类型:

trait B
trait A { this: B => }

说的是:"A 不能被混合到没有扩展 B 的具体类中。"

另一方面,以下内容:

trait B
trait A extends B

它表明 "任何(具体或抽象)混合 A 的类也将混合 B"

这两个语句不是意思相同的吗?Self-type 似乎只是为了创建一种简单的编译时错误的可能性。

我错过了什么吗?


35
可以在自身类型中使用类型参数: trait A[Self] {this: Self => } 是合法的,trait A[Self] extends Self 不合法。 - Blaisorblade
4
自类型也可以是一个类,但特质不能继承自类。 - cvogt
10
一个特性可以从一个类中继承(至少在2.10版本中如此):http://pastebin.com/zShvr8LX - Erik Kaplun
1
@Blaisorblade:不过,这不是可以通过进行小型语言重新设计来解决的问题吗?(至少从问题的角度来看) - Erik Kaplun
我发现这个自类型非常有用,可以强制要求实现特质的类扩展一个(密封的)_trait-Enum_。请参阅此链接:http://stackoverflow.com/q/36066238/1206998 - Juh_
显示剩余3条评论
11个回答

0
在第一种情况下,B 的子特质或子类可以混合到使用 A 的任何地方。因此,B 可以是一个抽象特质。

不,B可以(而且实际上是)在两种情况下都是“抽象特征”。因此,从这个角度来看没有区别。 - Robin Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接