8

パラメトリックフィールドx以下の例のように)が通常のフィールドのように動作することを理解しています。したがって、メソッドでそれらを参照できます。

class Test(val x: Int) { // x is a parametric field
  override def toString = "Test: " + x;
}

ただし、キーワードを削除してvalも、コードはコンパイルされます(そして、検索と.class出力xは引き続きクラスのメンバーです)。val x: Intだから私は疑問に思っています、パラメトリックフィールド(すなわち、上記)とコンストラクター引数( )の違いは何x: Intですか?

(私の頭の後ろにJavaがあるので、コンストラクターのスコープにはのようなメソッドが含まxないことを期待していましたtoString。)

4

2 に答える 2

12

キーワードがないval場合、コードは次のようになりますclass Test (private[this] val x: Int) { ... }。したがって、xクラス全体で利用できますが、外部からは利用できません。

質問には記載されていませんが、役立つ場合もあります。case classデフォルトの修飾子はvalです。したがってcase class Test(x: Int) {...}、と同等case class (val x: Int) {...}です。

于 2012-06-25T12:27:37.673 に答える
4

コンストラクターパラメーターは事実上private[this]フィールドになりますが、少なくとも1つのメソッドで参照されている場合に限ります。それ以外の場合、フィールドはクラスに生成されません。

例えば:

class Foo(i: Int) {
  println(i)
}

になります

$ javap -private Foo
Compiled from "Foo.scala"
public class Foo extends java.lang.Object implements scala.ScalaObject{
    public Foo(int);
}

だが

class Bar(i: Int) {
  def baz = println(i)
}

になります

$ javap -private Bar
Compiled from "Bar.scala"
public class Bar extends java.lang.Object implements scala.ScalaObject{
    private final int i;
    public void baz();
    public Bar(int);
}
于 2012-07-06T20:13:25.623 に答える