为什么Scala特质可以扩展类?

61

我看到 Scala 中的特质与 Java 中的接口相似(但在 Java 中,接口扩展其他接口,它们不扩展类)。我在 SO 上看到了一个关于特质使用的示例,其中一个特质扩展了一个类。

这是为什么呢?为什么特质可以扩展类?


1
如果您阅读了您链接的答案,您会发现特质与接口非常不同,因为它们可以包含实现。 - Jan Hudec
2
你可能也对特质继承和自类型注释之间的区别感兴趣:https://dev59.com/enI-5IYBdhLWcg3wKE-x - Malte Schwerhoff
是的,我理解了特质与接口不同之处在于特质可以包含方法的部分实现,但我不确定特质扩展类的目的(如示例所述)。 - Raj
1个回答

77

可以,一个扩展 class trait 会对可以扩展该 trait classes 施加限制——即,所有混入该 trait classes 必须扩展该 class

scala> class Foo
defined class Foo

scala> trait FooTrait extends Foo
defined trait FooTrait

scala> val good = new Foo with FooTrait
good: Foo with FooTrait = $anon$1@773d3f62

scala> class Bar
defined class Bar

scala> val bad = new Bar with FooTrait
<console>:10: error: illegal inheritance; superclass Bar
 is not a subclass of the superclass Foo
 of the mixin trait FooTrait
       val bad = new Bar with FooTrait
                              ^

15
有趣。但是,您还可以通过将类型约束放在自身类型上来限制可以混合到特质中的类,例如trait FooTrait { self:Foo => }。什么情况下会使用其中一种技术而不是另一种? 回答:当您需要确保混入特质的类都满足某些条件时,可以使用带有自身类型约束的技术。另一方面,如果您只想确保特质被用于与指定类型兼容的类,则可以使用类型参数的方式来限制。选择哪种技术取决于您的具体需求和实际场景。 - AmigoNico
Scala 的类型系统有点复杂。我确实认为这可能非常有用,但有人能举出具体的例子吗? - leinaD_natipaC
3
这是一个例子,说明为什么你可能更喜欢继承一个类。 - Mifeet

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