클래스와 컴패니언의 이름이 충돌해요

클래스와 컴패니언의 이름이 충돌해요 (E096: Class And Companion Name Clash)

클래스/트레이트와 그 컴패니언 객체가 같은 이름의 클래스 · 트레이트 · 객체를 모두 정의하면 이 에러가 나요. 클래스와 컴패니언 객체는 중첩 타입의 네임스페이스를 공유해요.

출처: Scala 3 Reference

본문

클래스나 트레이트와 그 컴패니언 객체가 같은 이름의 클래스 · 트레이트 · 객체를 모두 정의하면 이 에러가 발생해요.

클래스와 그 컴패니언 객체는 중첩 타입에 대해 같은 네임스페이스를 공유해요. 그래서 양쪽이 같은 이름의 타입을 정의할 수 없죠.

예시 (Example)

class Outer:
  class Inner

object Outer:
  class Inner

class Outerobject Outer가 둘 다 Inner라는 이름의 클래스를 정의했네요.

에러 (Error)

-- [E096] Naming Error: example.scala:2:8 --------------------------------------
2 |  class Inner
  |        ^
  |       Name clash: both class Outer and its companion object defines Inner
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | A class and its companion object cannot both define a class, trait or object with the same name:
  |   - class Outer defines class Inner
  |   - object Outer defines class Inner
   -----------------------------------------------------------------------------

해결 방법 (Solution)

중첩 타입의 이름을 서로 다르게 지어요.

// Use different names for the nested types
class Outer:
  class InnerClass

object Outer:
  class InnerObject

또는 타입을 한쪽에만 정의하는 방법도 있어요.

// Or define the type in only one place
class Outer:
  class Inner

object Outer:
  // Use Outer#Inner or define something else here
  def create(): Outer#Inner =
    val out = new Outer()
    new out.Inner()