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或模式匹配声明中使用它,则它将成为该类的每个实例的一部分。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |