首页 > 解决方案 > 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 是假设的?有人可以解释一下吗?是我对默认构造函数或方法范围的理解有问题吗?

标签: scaladefault-constructor

解决方案


在 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 然后看看它生成了什么

推荐阅读