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

Scala类成员和构造函数参数名称冲突

发布时间:2020-12-16 09:36:58 所属栏目:安全 来源:网络整理
导读:考虑下面用Java编写的类: class NonNegativeDouble { private final double value; public NonNegativeDouble(double value) { this.value = Math.abs(value); } public double getValue() { return value; }} 它定义了一个称为值的最终字段,它在构造函数
考虑下面用Java编写的类:

class NonNegativeDouble {
    private final double value;
    public NonNegativeDouble(double value) {
        this.value = Math.abs(value);
    }
    public double getValue() { return value; }
}

它定义了一个称为值的最终字段,它在构造函数中初始化,通过使用它的参数,并将其应用于该函数。

我想在Scala中写下类似的东西。起初,我试过:

class NonNegativeDouble(value: Double) {
  def value = Math.abs(value)
}

但编译器抱怨:error:重载方法值需要结果类型

显然,编译器认为表达式Math.abs(value)中的表达式值是指被定义的方法。因此,定义的方法是递归的,所以我需要声明其返回类型。所以,我写的代码不会做我所期望的那样做:我想要Math.abs(value)中的值引用构造函数参数值,而不是定义的方法。就好像编译器会隐式添加一个。到Math.abs(this.value)。

将val或var(或private … variant)添加到构造函数参数似乎没有帮助。

所以,我的问题是:我可以定义与构造函数参数相同名称的属性,但也可能是不同的值?如果是这样,怎么办?如果没有,为什么?

谢谢!

解决方法

不,你不行在Scala中,构造函数参数是属性,因此重新定义它们是没有意义的。

解决方案当然是使用另一个名字:

class NonNegativeDouble(initValue: Double) {
  val value = Math.abs(initValue)
}

这样使用,initValue不会被创建的实例的一部分。但是,如果在def或模式匹配声明中使用它,则它将成为该类的每个实例的一部分。

(编辑:李大同)

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

    推荐文章
      热点阅读