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

时间:2013-05-07 02:27:19

标签: java scala

我是Scala的新手,开始学习语言以获得乐趣,我仍然试图理解它。我对Scala特性的理解是它们就像java接口,除了一些方法可以有一个实现。

Java 8正在添加可以使用默认方法的接口,可以在其中提供实现。

Java 8接口和Scala特性之间有什么相同点和不同之处?

3 个答案:

答案 0 :(得分:40)

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

前者是为了支持安全的API演变和有限形式的多重继承而引入的。利用Project Lambda中的函数式编程习惯,例如,将 forEach(lambda) 方法添加到java.util.Collection接口而不改变所有可能的实现者(这实际上是不可能的)是有益的。不破坏向后兼容性)。作为副作用,这也提供了mixin composition的形式。

Scala traits 是从头开始设计的,作为模块化组件组合的构建块。它们是多继承友好的,并且由于线性化对混合的评估顺序有严格的规则而没有diamond problem。它们也支持state,可以引用实现类并限制哪种类型可以混合使用。查看Scala集合库,其中使用了特征。

答案 1 :(得分:10)

请注意,对于scala 2.12.0 RC1 (Sept. 2016)Trait现在编译为接口 Scala 2.12就是要充分利用Java 8的新功能

  

使用Java 8允许接口中的具体方法,Scala 2.12能够将特征编译为单个接口。

     

之前,特征表示为一个包含方法实现和界面的类。   请注意,编译器在幕后仍然具有相当多的魔力,因此如果要用Java实现特征,必须小心。   (简而言之,如果特征执行以下任何一个特性,其子类需要合成代码:定义字段,在主体中调用super,initializer语句,扩展类,依靠线性化来查找正确的超级特征中的实现。)

请参阅scala PR 5003更多实施的差异。

答案 2 :(得分:2)

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

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

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

new B() with A 

与明智的做法一样,我们可以继续在实例上添加特征层。