我是Scala的新手,开始学习这种语言很有趣,但我仍在努力使之发展。我对Scala特性的理解是,它们类似于Java接口,不同之处在于某些方法可以实现。
Java 8正在添加接口,这些接口可以具有可以提供实现的默认方法。
Java 8接口和Scala特性之间的异同是什么?
我是Scala的新手,开始学习这种语言很有趣,但我仍在努力使之发展。我对Scala特性的理解是,它们类似于Java接口,不同之处在于某些方法可以实现。
Java 8正在添加接口,这些接口可以具有可以提供实现的默认方法。
Java 8接口和Scala特性之间的异同是什么?
Answers:
Java 8的默认方法和Scala特性的动机不同。
引入前者是为了支持安全的API演进和有限形式的多重继承。利用Project Lambda中的函数式编程习惯用法,例如forEach(lambda)
在java.util.Collection
不更改所有可能的实现者的情况下添加接口方法是有益的(实际上,如果不破坏向后兼容性,则是不可能做到的)。作为副作用,这也提供了混合素组合物的一种形式。
Scala特性是从头开始设计的,作为模块化组件组合的构建块。它们是多继承友好的,并且由于线性化而对混合项的评估顺序具有严格的规则,因此没有钻石问题。它们还支持状态,可以引用实现类并在可以混合它们的类型上设置限制。查看Scala集合库,其中充分使用了特征。
请注意,使用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更多区别。
基于相似性,两者都可以具有默认方法,
差异方面,我们可以将特征仅添加到实例,而不是整个类。例:
trait A { def m = ??? }
class B
new B() with A
同样,我们可以继续在实例上添加特征层。