값 클래스는 abstract일 수 없어요
값 클래스는 abstract일 수 없어요 (E074: Value Classes May Not Be Abstract)
값 클래스에 abstract 수식어를 붙이면 이 에러가 나요. 값 클래스는 컴파일러가 인라인 처리하기 위해 반드시 구체(concrete)여야 해요.
본문
값 클래스(AnyVal을 상속하는 클래스)를 abstract로 선언하면 이 에러가 발생해요.
값 클래스는 컴파일러가 인라인 처리하도록 만들어진 타입이라 반드시 구체적이어야 해요. 추상 값 클래스는 인스턴스화할 수 없으니, 객체 할당을 피하겠다는 값 클래스의 본래 목적을 달성할 수가 없죠.
예시 (Example)
abstract class Wrapper(val value: Int) extends AnyVal
에러 (Error)
-- [E074] Syntax Error: example.scala:1:15 -------------------------------------
1 |abstract class Wrapper(val value: Int) extends AnyVal
| ^
| Value classes may not be abstract
해결 방법 (Solution)
abstract 수식어를 빼면 돼요.
// Remove the abstract modifier
class Wrapper(val value: Int) extends AnyVal
추상화가 필요하다면 값 클래스 대신 유니버설 트레이트(universal trait)를 쓰는 방법이 있어요.
// For abstraction, use a universal trait
trait Numeric extends Any:
def value: Int
class Wrapper(val value: Int) extends AnyVal with Numeric