Scala特性与Java 8接口之间的区别和相似之处是什么?


84

我是Scala的新手,开始学习这种语言很有趣,但我仍在努力使之发展。我对Scala特性的理解是,它们类似于Java接口,不同之处在于某些方法可以实现。

Java 8正在添加接口,这些接口可以具有可以提供实现的默认方法。

Java 8接口和Scala特性之间的异同是什么?


4
检查出的网站,它可以帮助你infoq.com/articles/java-8-vs-scala
akki0996

3
tl; dr:虚拟扩展方法[默认方法]的主要动机是API的发展。可喜的副作用是它们提供了多种继承形式,而这种形式仅限于行为。Scala中的特征不仅提供行为的多重继承,而且还提供状态的多重继承。除了状态和行为继承外,特征还提供了对实现类的引用。[Scala]特征提供了比[Java 8的]虚拟扩展方法更丰富的功能。
Brice Roncace 2014年

Answers:


46

Java 8的默认方法Scala特性的动机不同。

引入前者是为了支持安全的API演进和有限形式的多重继承。利用Project Lambda中的函数式编程习惯用法,例如forEach(lambda)java.util.Collection不更改所有可能的实现者的情况下添加接口方法是有益的(实际上,如果不破坏向后兼容性,则是不可能做到的)。作为副作用,这也提供了混合素组合物的一种形式。

Scala特性是从头开始设计的,作为模块化组件组合的构建块。它们是多继承友好的,并且由于线性化而对混合项的评估顺序具有严格的规则,因此没有钻石问题。它们还支持状态,可以引用实现类并在可以混合它们的类型上设置限制。查看Scala集合库,其中充分使用了特征。


您能否详细介绍一下“ Scala特性是从头开始设计的,是模块化组件组合的构建基块”。?
阿德林

14

请注意,使用scala 2.12.0 RC1(2016年9月)时Trait现在可以编译为接口。
Scala 2.12旨在充分利用Java 8的新功能

通过Java 8在接口中允许使用具体方法,Scala 2.12可以将特征编译为单个接口。

以前,特征表示为一个类,其中包含方法实现和接口
请注意,编译器仍有很多魔术可以在后台执行,因此如果要使用Java实现特征,则必须格外小心。
(简而言之,如果特征执行以下任何子类操作,则需要合成代码:定义字段,在主体中调用super,initializer语句,扩展类,依靠线性化来找到正确的super trait中的实现。)

参见scala PR 5003更多区别。


4

基于相似性,两者都可以具有默认方法,

差异方面,我们可以将特征仅添加到实例,而不是整个类。例:

trait A { def m = ??? }
class B 

new B() with A 

同样,我们可以继续在实例上添加特征层。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.