스칼라는 정적 메서드로 동반자 개체의 메서드를 컴파일하는 것처럼 보이므로 Java 코드에서 호출하는 것이 더 쉽습니다. 예를 들어, CompanionObject $ .MODULE $ .method() 대신 CompanionObject.method()를 작성할 수 있습니다. 그러나 때로는 관련없는 코드 변경으로 인해 이러한 동작이 중단 될 수 있습니다. 나는스태틱 메소드로 컴파일 된 companion 오브젝트의 메소드?
$ cat TestCompanion.scala
class TestCompanion
object TestCompanion {
def init2 {}
}
@SerialVersionUID(1L)
class TestCompanion2
object TestCompanion2 {
def init2 {}
}
$ scalac -version
Scala compiler version 2.9.0.1 -- Copyright 2002-2011, LAMP/EPFL
$ scalac TestCompanion.scala
$ javap TestCompanion
Compiled from "TestCompanion.scala"
public class TestCompanion extends java.lang.Object implements scala.ScalaObject{
public static final void init2();
public TestCompanion();
}
$ javap TestCompanion2
Compiled from "TestCompanion.scala"
public class TestCompanion2 extends java.lang.Object implements scala.ScalaObject{
public static final long serialVersionUID;
public static {};
public TestCompanion2();
}
그래서 TestCompanion와 TestCompanion2 사이의 유일한 차이는 후자가 @SerialVersionUID로 주석하고, init2이 TestCompanion의 정적 방법으로하지만 TestCompanion2에서 컴파일되어있는 문제를 설명하기 위해 예를 내놓았다.
scalac이 왜이 두 클래스를 다르게 취급하는지 설명 할 수 있습니까? @SerialVersionUID 어노테이션이 정적 메소드의 가용성에 어떻게 영향을 미치는지 보지 못합니다.
같은 동작 2.9.1 및 2.10.0.r25798-b20111007020214에 : 여기
는 관련 디 컴파일 바이트 코드입니다. 버그가 저에게, 또는 적어도 불일치처럼 보입니다 –이 버그는 2.10.0-M3 및 이후 버전에서 수정되었습니다. – soc