scala - Scala编译错误:方法参数的成员对类方法不可见
问题描述
我收到以下编译错误:
value txn is not a member of Charge
new Charge(this.txn + that.txn)
^
使用以下 Scala 类定义:
class Charge(txn: Double = 0){
def combine(that:Charge): Charge =
new Charge(this.txn + that.txn)
}
将 txn 显式声明为 val 允许它工作:
class Charge(val txn: Double = 0){
def combine(that:Charge): Charge =
new Charge(this.txn + that.txn)
}
我以为 val 是假设的?有人可以解释一下吗?是我对默认构造函数或方法范围的理解有问题吗?
解决方案
在 scala 中,您可以以两种形式定义类,例如。
class Charge(txn: Double)
-> 在这种情况下,scala 编译器将其编译为 java,如下所示
public class Charge {
....
public Charge combine(Charge);
....
public Charge(double);
....
}
正如您在已编译的 java 代码中所注意到的,没有公共访问器txn
让我们看一下类的另一个变体Charge
,如果您这样定义class Charge(val txn: String)
,它将被编译到下面
public class Charge {
...
public double txn();
...
public Charge combine(Charge);
...
public Charge(double);
...
}
如您所见,在这种情况下,编译器会生成public
访问器,txn
因此您可以that.txn
在将其标记为时访问val
case class Charge(txn: Double)
: 这是 scala为你生成getters
的数据equals
类。toString
你可以编译这个类scalac Charge.scala
javap -c Charge.class
然后看看它生成了什么