나는 스칼라를 가지고 놀고있다. 3 개의 재미있는 것을 발견했습니다 (제목은 세 번째 것입니다)..NET 용 스칼라 컴파일러가 val의 의미를 무시하는 이유는 무엇입니까?
1 val로 선언 된 지역 변수는 final로 해석되지 않습니다.
class HowAreVarAndValImplementedInScala {
var v1 = 123
val v2 = 456
def method1() = {
var v3 = 123
val v4 = 456
println(v3 + v4)
}
}
내가 바이트 코드로 위의 스칼라 코드를 컴파일하고 자바로 그 디 컴파일, 그것은 다음과 같습니다 경우 :
public class HowAreVarAndValImplementedInScala
{
private int v1 = 123;
private final int v2 = 456;
public int v1()
{
return this.v1;
}
public void v1_$eq(int x$1) { this.v1 = x$1; }
public int v2() { return this.v2; }
public void method1() {
int v3 = 123;
int v4 = 456;
Predef..MODULE$.println(BoxesRunTime.boxToInteger(v3 + v4));
}
}
우리가 v2에서 최종 볼 수 있지만 V4가 아닌, 그 이유는 무엇입니까?
는 .NET 용2 스칼라 컴파일러는이처럼, 우리는 위의 CIL에 후 디 컴파일 C 번호로 표시된 스칼라 코드를 컴파일 할 경우 (전부는 아니지만) 많은 공공 인스턴스 메소드
을 키워드를 오버라이드 (override) 추가 :
public class HowAreVarAndValImplementedInScala : ScalaObject
{
private int v1;
private int v2;
public override int v1()
{
return this.v1;
}
public override void v1_$eq(int x$1)
{
this.v1 = x$1;
}
public override int v2()
{
return this.v2;
}
public override void method1()
{
int v3 = 123;
int v4 = 456;
Predef$.MODULE$.println(v3 + v4);
}
public HowAreVarAndValImplementedInScala()
{
this.v1 = 123;
this.v2 = 456;
}
}
모든 공용 인스턴스 메소드 (생성자를 제외) 오버라이드로 표시되는 이유는 무엇입니까? 그게 필요한가요?
자바 couter 부분에서, V2는 최종으로 표시되는 동안 .NET 3 스칼라 컴파일러 브로 의미 상기 C# 코드에, 우리는 그 V2 단지 일반 필드 볼 수 느슨해
, shouldn 't v2는 .net 용 스칼라 컴파일러에서 읽기 전용으로 표시됩니다. (버그?)
필자가 아는 한 'final'은 지역 변수에 런타임 의미가 없지만 * 값을 변경하지 않을 것이라고 강조했습니다. 대조적으로 '최종'필드는 생성자가 실행 된 후에 초기화된다는 것을 의미합니다. 따라서 ** v4는 컴퓨터와 관련이 없으므로 생략됩니다. 반면에 v2는 Java에서 final이어야합니다. 그러나 나는이 대답을하기에 충분하지 않다. –
3 개의 질문은 3 가지 질문이어야합니다 ... –
@MatthiasMeid 예, 올바르게 보입니다 – CuiPengFei