E010: 최상위 암시적 클래스

E010: 최상위 암시적 클래스 (Top Level Implicit Class)

참고: 이 에러 코드는 Scala 3.2.0에서 비활성화(inactive)됐어요. 이제 최상위 레벨에서 암시적 클래스(implicit class)가 허용돼요.

출처: Scala 3 Reference

본문

이 에러는 더 이른 버전의 Scala 3에서, 암시적 클래스가 파일의 최상위 레벨에 정의되고 object, class, 패키지 객체(package object) 안에 중첩되지 않았을 때 발생했어요.

Scala 2와 초기 Scala 3에서 암시적 클래스는 암시적 해석(implicit resolution)과 스코프의 잠재적 문제를 막기 위해 다른 정의(예: object나 패키지 객체) 안에 정의돼야 했어요. 이 제한은 나중에 Scala 3.2.0에서 풀렸죠.

Example (Scala 3.0.x - 3.1.x)

// Top-level implicit class - not allowed in Scala 3.0-3.1
implicit class RichInt(val x: Int) {
  def square: Int = x * x
}

Error

-- [E010] Syntax Error: example.scala:2:0 ------------------------------------
2 |implicit class RichInt(val x: Int) {
  |^
  |An implicit class may not be top-level

Solution (Scala 3.0.x - 3.1.x)

// Wrap in an object
object Extensions {
  implicit class RichInt(val x: Int) {
    def square: Int = x * x
  }
}

// Usage
import Extensions._
val result = 5.square
// Or use a package object
package object mypackage {
  implicit class RichInt(val x: Int) {
    def square: Int = x * x
  }
}

Solution (Scala 3.2.0+)

// Top-level implicit classes are now allowed
implicit class RichInt(val x: Int) {
  def square: Int = x * x
}

// However, prefer using extension methods in Scala 3
extension (x: Int)
  def square: Int = x * x

더 알아보기

  • Scala 3에서는 암시적 클래스보다 확장 메서드(extension method)를 권장해요.
  • 확장 메서드는 "Contextual Abstractions - Extension Methods" 섹션에서 다룹니다.