明示的に宣言しない限りval
はfinal
ではないことがわかっています。javapを使用すると、スカラックがバイトコードにfinal
を挿入していないことが確認されます。valはどのように不変ですか?
したがって、val
は、コンパイラがそれを変更しようとするコードを記述するのを止めてしまうため、変更不可能ですか?
val
は、あなたが最初の宣言の後、それに何かを割り当てることにより、変数を変更(変異させる)ことができないことを意味:
明示的に宣言しない限りval
はfinal
ではないことがわかっています。javapを使用すると、スカラックがバイトコードにfinal
を挿入していないことが確認されます。valはどのように不変ですか?
したがって、val
は、コンパイラがそれを変更しようとするコードを記述するのを止めてしまうため、変更不可能ですか?
val
は、あなたが最初の宣言の後、それに何かを割り当てることにより、変数を変更(変異させる)ことができないことを意味:
final
と不変性は、2つの直交概念ですそれはによって実装されますJVMバイトコードで
val x = 1
x = 2 // error: reassignment to val
プライベートメンバーとゲッターを作成しますが、セッターではない:
class A {
val x = 1
}
=>
// Java equivalent of a generated bytecode
public class A {
private final int x;
public int x() { return x; }
...
}
final
は、」あなたができることを意味しますトンサブクラスであなたのval
をオーバーライドする:あなたはvar
の代わりval
を使用する場合
class A {
final val x = 1
}
class B extends A {
override val x = 2
}
// error: overriding value x in class A of type Int(1);
// value x cannot override final member
final
は、同じエラーが発生します。
'val'sが' final'でない理由を[this](http://stackoverflow.com/a/13428362/1263942)で確認してください: –