E162: 인라인 코드 안에 case class를 정의할 수 없어요
E162: 인라인 코드 안에 case class를 정의할 수 없어요 (Case Class In Inlined Code)
case class나 case object를 인라인 메서드(inline method)나 quoted 코드 블록 안에 정의할 때 발생하는 에러예요.
본문
case class 정의는 상당한 양의 바이트코드를 만들어 내요(apply, unapply, copy, equals, hashCode, toString과 그 외 메서드들). 이런 정의를 인라인하게 되면 모든 호출 지점에서 그 바이트코드 크기가 곱해져서 과도한 코드 비대(code bloat)가 발생해요.
Example
inline def example = {
case class Data(x: Int)
Data(42)
}
Error
-- [E162] Syntax Error: example.scala:2:13 -------------------------------------
2 | case class Data(x: Int)
| ^^^^^^^^^^^^^^^^^^^^^^^
|Case class definitions are not allowed in inline methods or quoted code. Use a normal class instead.
|-----------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Case class/object definitions generate a considerable footprint in code size.
| Inlining such definition would multiply this footprint for each call site.
-----------------------------------------------------------------------------
Solution
// Define case class outside the inline method
case class Data(x: Int)
inline def example = Data(42)
// Or use a regular class inside the inline method
inline def example = {
class Data(val x: Int)
new Data(42)
}
더 알아보기
inline메서드와 quoted 코드에 대한 자세한 내용은 Scala 3 Reference의 inline 문서를 참고하세요.