首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala特征与Java 8接口有什么不同和相似之处?

Scala特征与Java 8接口有什么不同和相似之处?
EN

Stack Overflow用户
提问于 2013-05-07 10:27:19
回答 3查看 22.2K关注 0票数 86

我是Scala的新手,开始学习这门语言是为了好玩,我仍然在努力理解它。我对Scala特征的理解是,它们类似于java接口,只是有些方法可以有实现。

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

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

EN

回答 3

Stack Overflow用户

发布于 2013-05-28 20:00:54

ScalaJava8的默认方法和的特征的动机是不同的。

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

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

票数 48
EN

Stack Overflow用户

发布于 2016-09-19 03:56:02

请注意,使用scala 2.12.0 RC1 (Sept. 2016)时,Trait现在可以编译为接口。

Scala2.12完全是为了充分利用Java8的新特性

使用Java8允许在接口中使用具体的方法,Scala2.12能够将特征编译为单个接口。

在此之前,被表示为包含方法实现和接口的类。

请注意,编译器仍然可以在幕后执行相当多的魔术,因此如果要在Java中实现特征,则必须小心。

(简而言之,如果一个特征做了以下任何事情,它的子类需要合成代码:定义字段、调用超级、主体中的初始化器语句、扩展类、依赖于线性化来找到正确的超级特征中的实现。)

票数 14
EN

Stack Overflow用户

发布于 2018-12-05 13:53:33

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

不同的方面,我们可以只向实例添加特征,而不是向整个类添加特征。示例:

代码语言:javascript
复制
trait A { def m = ??? }
class B 

new B() with A 

就像wise一样,我们可以继续在实例上添加特征层。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16410298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档