1

単純な問題:読み取りメソッドを持つScalaでFilterInputStreamをサブクラス化しています:

public void read(byte [] b,int offset,int len)

読み取られるデータはbに入れられますが、パラメーターはScalaメソッドの「vals」であるため、これを適切にサブクラス化する方法がわかりません。読み取るデータにbを設定するにはどうすればよいですか?Java * InputStreamは、私にあまり選択肢を残しません。

4

3 に答える 3

8

を実行するだけで、アイテムをbat indexに入れることができます。それはこれには影響しません。これは、再割り当てができないことを意味するだけです(これを行うのは役に立ちません)。ib(i) = whateverbvalb

于 2010-10-17T17:11:31.903 に答える
6

valScalaで a ではなく aとして宣言するだけではvar、不変にはなりません。実際、var不変の値に名前を付けることができます。覚えておくべきことは、Scala の変数は、Java の変数と同じように、実際に値を含むのではなく、常に*参照またはハンドルであるということです。

REPL でこれを試してください:

class Container { var content: String = "default" }
val a = new Container
val b = a
b.content = "modified"
println(a.content)

実行すると、同じもの (コピーではなく、コンテナのまったく同じインスタンス) の名前val b = aが作成されます。このため、実行すると変更も反映されます。それは同じものの別の名前です。これは valであっても発生することに注意してください。すべての手段は、どのインスタンスの名前を変更できないかということです。bab.content = "modified"aavala

次に、このわずかな違いについて考えてみましょう。

class Container { var content: String = "default" }
def update(c: Container) { c.content = "modified" }
val a = new Container
update(a)
println(a.content)

を呼び出す場合update、そのパラメータcはの参照またはエイリアスでaあります。したがって、変更は、前の例と同じようにメソッド呼び出しの外部に反映されます。

配列は変更可能であるため、このようにも機能します。

*: プリミティブ変数 (bytes、double、int など) は Java では参照されません。それらのボックス化された同等物 (java.lang.Byte...) は次のとおりです。とにかくこれらのクラス/タイプは不変であるため、それほど多くはありません。

于 2010-10-17T20:29:46.837 に答える
5
def read(b: Array[Byte], offset: Int, len: Int): Unit

Javaで次のことと同等です:

public void read(final byte[] b, final int offset, final int len)

配列bは引き続き可変であり、その内容を変更できます。

于 2010-10-17T17:26:02.567 に答える