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

ams*_*ams 77 java scala

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

Java 8添加的接口可以具有可以提供实现的默认方法.

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

Tva*_*roh 43

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

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

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

  • 您能否详细说明一下“Scala 特征是从头开始设计的,作为模块化组件组合的构建块”。? (2认同)

Von*_*onC 13

请注意,使用scala 2.12.0 RC1(2016年9月),Trait现在编译为接口.
Scala 2.12旨在最佳地利用Java 8的新功能

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

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

请参阅scala PR 5003更多实施的区别.


小智 6

在相似性上,两者都可以有默认方法,

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

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

new B() with A 
Run Code Online (Sandbox Code Playgroud)

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