2011-10-28 7 views
6

스칼라는 정적 메서드로 동반자 개체의 메서드를 컴파일하는 것처럼 보이므로 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 어노테이션이 정적 메소드의 가용성에 어떻게 영향을 미치는지 보지 못합니다.

+0

같은 동작 2.9.1 및 2.10.0.r25798-b20111007020214에 : 여기

object WithoutUID { val instance = new WithoutUID } class WithoutUID extends scala.Serializable object WithUID { val instance = new WithUID } @SerialVersionUID(0) class WithUID extends scala.Serializable 

는 관련 디 컴파일 바이트 코드입니다. 버그가 저에게, 또는 적어도 불일치처럼 보입니다 –

+0

이 버그는 2.10.0-M3 및 이후 버전에서 수정되었습니다. – soc

답변

4

이것은 알려진 버그입니다 : Static forwarders are missing after adding @SerialVersionUID, Josh Cough가 제기했습니다. 버그의 설명에서 : 다음 코드

클래스에 @SerialVersionUID 부가 바이트 코드에서 누락 정적 전달자에 결과.

public class WithoutUID implements Serializable, ScalaObject { 
    public static final WithoutUID instance(){ 
    return WithoutUID.MODULE$.instance(); 
    } 
} 

public class WithUID implements Serializable, ScalaObject { 
    public static final long serialVersionUID = 0L; 
} 
관련 문제