我刚接触Scala,学习这门语言很有趣,但仍在努力理解它。我对Scala特质的理解是,它们类似于Java接口,不同之处在于某些方法可以有实现。
Java 8引入了可以具有默认方法和实现的接口。
Java 8接口和Scala特质之间的相似点和差异是什么?
Java 8引入了可以具有默认方法和实现的接口。
Java 8接口和Scala特质之间的相似点和差异是什么?
Java 8默认方法和Scala traits的动机不同。
前者引入了安全API演进和有限形式的多继承支持。通过在Lambda项目中利用函数编程习语,例如向java.util.Collection
接口添加一个forEach(lambda)
方法,而不需要改变所有可能的实现者(这实际上是不可能做到的,因为会破坏向后兼容性)。作为副作用,这也提供了一种混合组合的形式。
Scala traits是从头设计的模块化组件构建块。它们友好支持多继承,并通过线性化的严格规则对混合的评估顺序避免了钻石问题。它们还支持状态,可以引用实现类并对可以混合它们的类型进行限制。请查看Scala集合库,其中广泛使用了traits。
Trait
现在编译为一个接口。关于相似性,两者都可以具有默认方法,
而在差异方面,我们只能为实例添加特征,而不能为整个类添加。例如:
trait A { def m = ??? }
class B
new B() with A