E218: Illegal Erased Definition — erased는 값(val)에만 허용돼요

E218: Illegal Erased Definition — erased는 값(val)에만 허용돼요

erased 수식어를 지원하지 않는 정의에 붙이면 이 에러가 발생해요. erased로 표시할 수 있는 건 딱 한 가지 — 지연되지 않은(lazy가 아닌) 불변 값 val뿐입니다. 나머지 정의 종류에는 erased를 쓸 수 없어요.

추가로, 어떤 값의 타입이 (예를 들어 compiletime.Erased를 상속해서) 암시적으로 erased가 되는 경우에도, 그 정의 종류가 지우기(erasure)를 지원하지 않으면 같은 에러가 나올 수 있어요.

출처: Scala 3 Reference

본문

Example

import scala.language.experimental.erasedDefinitions

object Test:
  erased lazy val x: Int = 42

lazy val에는 erased를 붙일 수 없어요.

Error

-- [E218] Type Error: example.scala:4:18 ---------------------------------------
4 |  erased lazy val x: Int = 42
  |                  ^
  |                  `erased` is not allowed for this kind of definition.
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | Only non-lazy immutable values can be `erased`
   -----------------------------------------------------------------------------

Solution

erased는 반드시 lazy가 아닌 val 정의에만 사용해야 해요.

import scala.language.experimental.erasedDefinitions

object Test:
  erased val x: Int = 42

만약 erased 파라미터를 가진 메서드가 필요하다면, 대신 erased 파라미터를 쓰면 됩니다.

import scala.language.experimental.erasedDefinitions

def compute(erased hint: Int): Int = 42