AnyVal을 상속할 수 없음
AnyVal을 상속할 수 없음 (Cannot Extend AnyVal)
트레이트나 객체가 AnyVal을 상속하려 할 때 나오는 에러예요.
본문
트레이트나 객체가 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를 상속한 범용 트레이트로 만들면 돼요.