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

scala – 为什么val和def在不同的时间实现抽象方法?

发布时间:2020-12-16 09:06:34 所属栏目:安全 来源:网络整理
导读:我正在使用 scala并做了类似这样的事情: trait Foo { val a: String }trait Foo2 extends Foo { val a = "foo" }trait Bar extends Foo { val b = a + "-bar" }object Bar2 extends Bar with Foo2 我预计Bar2.b将是“foo-bar”,但它最终会成为“null-bar”.
我正在使用 scala并做了类似这样的事情:

trait Foo { val a: String }
trait Foo2 extends Foo { val a = "foo" }
trait Bar extends Foo { val b = a + "-bar" }
object Bar2 extends Bar with Foo2

我预计Bar2.b将是“foo-bar”,但它最终会成为“null-bar”.如预期的那样,Bar2.a是“foo”.

如果我从val更改为def来定义’a’,如下所示:

trait Foo { def a: String }
trait Foo2 extends Foo { val a = "foo" }
trait Bar extends Foo { val b = a + "-bar" }
object Bar2 extends Bar with Foo2

Bar2.b实际上是“foo-bar”.

在示例2中,在评估val’b’之前,来自Foo2的def’a’在Foo中实现抽象的def’a’被置于Bar2的定义中.在示例1中,在Bar / Bar2中定义val’b’之后,来自Foo2的val’a’覆盖来自Foo的val’a’.

为什么会这样?为什么val和def在不同的时间实现抽象方法?

解决方法

你总是想在特征中使用def或lazy val(而不仅仅是val)来避免你发现的尴尬行为.

至于为什么要获得Scala在JVM中实现的低级细节,请查看Josh Suereth在Scala Days 2012中的精彩演讲“Binary Resilience”.

(编辑:李大同)

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

    推荐文章
      热点阅读