E210: Value Class Cannot Extend Alias of AnyVal

E210: Value Class Cannot Extend Alias of AnyVal

이 에러는 AnyVal을 직접 상속하는 대신 AnyVal의 타입 별칭(alias)을 상속하는 값 클래스를 정의하려고 할 때 발생해요.

출처: Scala 3 Reference

본문

값 클래스는 AnyVal을 직접 상속해야 해요. 타입 별칭을 사용하면 간접 계층이 생기는데, 값 클래스에 필요한 특별한 처리를 위해 컴파일러가 이 간접 계층을 해석할 수 없어요.

예시 (Example)

type MyAnyVal = AnyVal

class Wrapper(val value: Int) extends MyAnyVal

에러 (Error)

-- [E210] Syntax Error: example.scala:3:6 --------------------------------------
3 |class Wrapper(val value: Int) extends MyAnyVal
  |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |A value class cannot extend a type alias (type MyAnyVal) of AnyVal

해결 방법 (Solution)

타입 별칭 대신 AnyVal을 직접 상속해요.

class Wrapper(val value: Int) extends AnyVal

대안으로, 추상화가 필요하다면 값 클래스 대신 불투명 타입(opaque type)을 고려해 봐요.

object Types:
  opaque type Wrapper = Int
  object Wrapper:
    def apply(value: Int): Wrapper = value
  extension (w: Wrapper)
    def value: Int = w