클래스와 컴패니언의 이름이 충돌해요
클래스와 컴패니언의 이름이 충돌해요 (E096: Class And Companion Name Clash)
클래스/트레이트와 그 컴패니언 객체가 같은 이름의 클래스 · 트레이트 · 객체를 모두 정의하면 이 에러가 나요. 클래스와 컴패니언 객체는 중첩 타입의 네임스페이스를 공유해요.
본문
클래스나 트레이트와 그 컴패니언 객체가 같은 이름의 클래스 · 트레이트 · 객체를 모두 정의하면 이 에러가 발생해요.
클래스와 그 컴패니언 객체는 중첩 타입에 대해 같은 네임스페이스를 공유해요. 그래서 양쪽이 같은 이름의 타입을 정의할 수 없죠.
예시 (Example)
class Outer:
class Inner
object Outer:
class Inner
class Outer와 object 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()