Scala traits 与 Java 8 接口之间有什么区别和相似之处?
我是Scala的新手,开始学习这门语言是为了好玩,我仍然在努力解决这个问题。我对Scala特征的理解是,它们就像java接口,除了一些方法可以有实现。
Java 8正在添加可以具有默认方法的接口,这些方法可以提供实现。
Java 8 接口和 Scala 特性之间有什么相似之处和不同之处?
我是Scala的新手,开始学习这门语言是为了好玩,我仍然在努力解决这个问题。我对Scala特征的理解是,它们就像java接口,除了一些方法可以有实现。
Java 8正在添加可以具有默认方法的接口,这些方法可以提供实现。
Java 8 接口和 Scala 特性之间有什么相似之处和不同之处?
Java 8'默认方法和Scala特征的动机不同。
前者是为了支持安全的 API 演进和有限形式的多重继承而引入的。通过在Lambda项目中利用函数式编程习语,例如,在不改变所有可能的实现者的情况下将forEach(lambda)
方法添加到接口是有益的(这实际上不可能在不破坏向后兼容性的情况下完成)。作为副作用,这也提供了一种混合素组合物的形式。java.util.Collection
Scala特征是从头开始设计的,作为模块化组件组合的构建块。它们是多重继承友好的,并且由于线性化而对混合的评估顺序有严格的规定,因此没有钻石问题。它们还支持状态,可以引用实现类,并对哪种类型可以混合使用它们施加限制。看看 Scala 集合库,其中的特征被彻底使用。
请注意,使用 scala 2.12.0 RC1(2016 年 9 月),现在可以编译为接口。
Scala 2.12 就是要充分利用 Java 8 的新功能。Trait
Java 8允许在接口中使用具体方法,Scala 2.12能够将特征编译为单个接口。
以前,特征表示为保存方法实现和接口的类。
请注意,编译器在幕后仍然有相当多的魔力要执行,因此,如果要在Java中实现特征,则必须小心。
(简而言之,如果一个特征执行以下任何一项,则其子类需要合成代码:定义字段,调用主体中的super,初始值设定项语句,扩展类,依靠线性化来查找正确的超级特征中的实现。
参见 scala PR 5003 更多关于实现的差异。