10

나는 자바에서 스칼라 다음 코드 조각을 번역 할 :@SerialVersionUID를 익명 클래스에 추가하는 방법은 무엇입니까?

Foo foo = new Foo() { private static final long serialVersionUID = 12345L; } 

클래스 Foo는 추상 클래스입니다.

동일한 코드가 스칼라에서 어떻게 보이나요?

+0

제목과 실제 ​​질문은 어떤 관계가 있습니까? –

+0

글쎄, 나는 제목에서'@ SerialVersionUID'를 익명 클래스에 어떻게 추가 할 수 있는지 그리고 질문을하는'serialVersionUID'를 가진 생성 된 익명 클래스의 예제를 보여줄 것입니다. – soc

답변

10

Scala annotation for adding the ID이 있습니다. 그러나 익명의 내부 클래스에는이 솔루션을 적용 할 수 없습니다. 그러나 Scala FAQ에있어서

컴파일 시간에 공지 된 상수 평가 스칼라 값 전용

전용 정적 자바 최종 변수에 설정된다. 이 문서화되지 않은 기능은 유용한 기능입니다. 스칼라에서 목록의 구현을 확인하십시오 (예 : src/scala/List.java 참조). 클래스들 : 및 Nil은 다음 형식의 serialVersionUID 필드를 가지고 있습니다. private val serialVersionUID = numeric literal;

코드

object Ser extends Application { 
    trait Foo { def xy: Int } 
    val x = new Foo with java.io.Serializable { def xy = 2; private val serialVersionUID = 1L } 
} 

은 2.8.1 컴파일러 잘 컴파일합니다. 결과 클래스의 직렬 버전이 실제로 제공된 클래스인지 여부에 관계없이 테스트하지는 않았습니다.

+0

Mhh,하지만 이것은 클래스 메서드가 아닌 인스턴스 메서드로 추가 할 것입니다. 맞습니까? 나는 그것이 효과가 있다고 생각하지 않는다 ... – soc

+0

@soc : FAQ에서 발췌 한 내용을 보라 : "컴파일 타임에 알려진 상수로 평가되는 스칼라 private 값은 private static final 자바 변수로 바뀐다." – Dirk

+0

WTH? 나는 그것을 모르고서 이런 일이 일어날 것이라고 결코 생각하지 못했습니다 ... 많이 고마워요! 난 그저 필요한 모든 것이거나 serialVersionUID에 관한 몇 가지 특별한 마법이 필요한지 궁금하다. – soc