1

重複していると確信していますが、見つけることができませんでした。

このクラスを検討してください

class Test1(var param: Int)

Scala は getter と setter を生成し、param を private にします。

たとえば、javap を使用して表示できます。

public class Test1 {
  private int param;
  public int param();
  public void param_$eq(int);
  public Test(int);
}

明示的なゲッター/セッターを使用して脱糖バージョンを作成しようとしましたが、プライベート変数がゲッターと名前の衝突を起こしたのと同じように 100% 作成できませんでした。

class Test2(private[this] var param:Int) {
  def param:Int = this.param
  def param_= (param:Int) {this.param = param}
}

これはエラーです:

ambiguous reference to overloaded definition,
both method param in class Test2 of type => Int
and  variable param in class Test2 of type Int
match expected type Int
  def param:Int = param
                  ^

これはもちろん機能します(プライベートメンバーの名前を に変更し_paramます)

class Test3(private[this] var _param:Int) {
  def param:Int = this._param
  def param_= (param:Int) {this._param = param}
}

ただし、もちろん、このわずかに異なるバイトコードを生成します (名前を に変更する必要があったparamため_param):

public class Test3 {
  private int _param;
  public int param();
  public void param_$eq(int);
  public Test3(int);
}

Test1のように明示的なゲッター/セッターを使用しながら、の例と同じバイトコードに到達する方法はありますTest2か?

4

3 に答える 3

4

Scala では、メソッドとフィールドは同じ名前空間を共有します。これは、Java や、それぞれに別の名前空間を持つ他の言語からの変換者にとっては、少し混乱を招きます。

ただし、Uniform Access Principle に従います。つまり、クラスのユーザーは、括弧なしで使用すると、実際に def を呼び出しているのか、val (または var) を呼び出しているのかわかりません。これは、クライアントに影響を与えることなく、val と def の間で実装を切り替えることができることも意味します。(再コンパイルする必要があるかどうかはわかりませんが、ソース コードはそのままで構いません。

于 2013-07-10T05:07:26.823 に答える
0

変数とメソッドは同じように扱われ、変数 param はパラメーターのないメソッドのようであり、メソッド param は同じであるため、エラーが示すように、オーバーロードされた定義へのあいまいな参照だと思います。

于 2013-07-10T05:02:12.230 に答える