값 클래스는 다른 값 클래스를 감쌀 수 없어요
값 클래스는 다른 값 클래스를 감쌀 수 없어요 (E076: Value Classes May Not Wrap Another Value Class)
값 클래스의 파라미터 타입이 또 다른 사용자 정의 값 클래스면 이 에러가 나요. 값 클래스는 다른 사용자 정의 값 클래스를 감쌀 수 없어요.
본문
값 클래스(AnyVal을 상속하는 클래스)의 파라미터 타입이 또 다른 사용자 정의 값 클래스일 때 이 에러가 발생해요.
값 클래스는 다른 사용자 정의 값 클래스를 감쌀 수 없어요. 그렇게 되면 JVM에서 값 클래스를 표현하고 최적화하는 과정이 복잡해지거든요.
예시 (Example)
class Meters(val value: Double) extends AnyVal
class Distance(val meters: Meters) extends AnyVal
Distance의 파라미터 meters가 값 클래스 Meters 타입이네요.
에러 (Error)
-- [E076] Syntax Error: example.scala:2:6 --------------------------------------
2 |class Distance(val meters: Meters) extends AnyVal
| ^
| A value class may not wrap another user-defined value class
해결 방법 (Solution)
안쪽 값 클래스가 감싸고 있던 원시 타입(primitive type)을 바깥 값 클래스도 직접 감싸면 돼요.
// Wrap the underlying primitive type directly
class Meters(val value: Double) extends AnyVal
class Distance(val value: Double) extends AnyVal
object Distance:
def fromMeters(m: Meters): Distance = new Distance(m.value)
바깥 래퍼(wrapper)가 변환 로직을 담아야 한다면 일반 클래스를 쓰는 것도 방법이에요.
// Or use a regular class for the outer wrapper
class Meters(val value: Double) extends AnyVal
class Distance(val meters: Meters)