E010: 최상위 암시적 클래스
E010: 최상위 암시적 클래스 (Top Level Implicit Class)
참고: 이 에러 코드는 Scala 3.2.0에서 비활성화(inactive)됐어요. 이제 최상위 레벨에서 암시적 클래스(implicit class)가 허용돼요.
본문
이 에러는 더 이른 버전의 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" 섹션에서 다룹니다.