AnyVal을 상속할 수 없음

AnyVal을 상속할 수 없음 (Cannot Extend AnyVal)

트레이트나 객체가 AnyVal을 상속하려 할 때 나오는 에러예요.

출처: Scala 3 Reference

본문

트레이트나 객체가 AnyVal을 상속하려 하면 이 에러가 발생해요.

값 클래스(value class)가 되기 위해 AnyVal을 상속할 수 있는 건 클래스뿐이에요. 트레이트는 Any를 상속해 "범용 트레이트(universal trait)"가 될 수 있고, 이는 def 멤버만 가질 수 있어요. 범용 트레이트는 AnyVal을 상속한 클래스에 믹스인될 수 있어요.

예시

trait MyValueTrait extends AnyVal

에러 메시지

-- [E068] Syntax Error: example.scala:1:6 --------------------------------------
1 |trait MyValueTrait extends AnyVal
  |      ^
  |      trait MyValueTrait cannot extend AnyVal
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | Only classes (not traits) are allowed to extend AnyVal, but traits may extend
  | Any to become "universal traits" which may only have def members.
  | Universal traits can be mixed into classes that extend AnyVal.
   -----------------------------------------------------------------------------

해결 방법

// Use a class for value classes
class MyValueClass(val value: Int) extends AnyVal
// For traits, extend Any to create a universal trait
trait MyUniversalTrait extends Any:
  def method: Int

class MyValueClass(val value: Int) extends AnyVal with MyUniversalTrait:
  def method: Int = value

더 알아보기

  • 값 클래스는 클래스로 만들고, 트레이트가 필요하다면 Any를 상속한 범용 트레이트로 만들면 돼요.