加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么不扩展其他类的类必须从特征扩展? (不行)

发布时间:2020-12-16 09:14:09 所属栏目:安全 来源:网络整理
导读:我从 Scala开始,我发现这有点怪异.在java中,我可以这样做: interface Foo{}public class Bar implements Foo{} 我正在尝试与Scala类似的操作,但它不起作用: trait Foo;class Bar with Foo; // This doesn't work! 我必须使用“extends”关键字: class Bar
我从 Scala开始,我发现这有点怪异.在java中,我可以这样做:

interface Foo{}

public class Bar implements Foo{}

我正在尝试与Scala类似的操作,但它不起作用:

trait Foo;
class Bar with Foo; // This doesn't work!

我必须使用“extends”关键字:

class Bar extends Foo; // This works OK!

现在,没关系,但这不是我想要的.

我注意到另一件奇怪的是,考虑到Scala中的每个课程都从AnyRef扩展(见scala-lang.org:http://www.scala-lang.org/sites/default/files/images/classhierarchy.png),我可以这样做:

class Bar extends AnyRef with Foo; // This works too!

那么,我失踪了什么?没有扩展它使用特征没有意义吗?

谢谢!

解决方法

首先要注意的是,扩展/实现的差异对编译器没有任何意义,而不是不知道的.我不是说这是坏的,只是这个语言可以做到.在C#中,你编写A类:B,C,D,而不是类A扩展B实现C,D和类A实现B,D.所以你可以认为Scala的扩展就像冒号一样逗号.

然而,在过去,曾经是Foo类的Bar吧. 2006年Scala回归2.0时,改变了.见the change history.

我想我记得(不确定),原因只是那个与Foo的班级不太好读.

在Scala中,A与B是A类和B类的交集.如果类型A和类型B都是A类型,则为A类.因此,A类扩展B与C可以被读取类A扩展类型B与C.没有这样的东西与A类与B.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读