E194: Extension Nullified by Member

E194: Extension Nullified by Member

이 경고는 확장(extension) 메서드가 절대 선택되지 않을 것임을 컴파일러가 알았을 때 나와요. 대상 타입에 이미 같은 이름과 호환되는 파라미터 타입을 가진 멤버가 있기 때문이에요.

출처: Scala 3 Reference

본문

확장 메서드는 오버로드될 수는 있지만, 기존 멤버 메서드를 오버로드하지는 못해요. 어떤 값에 대해 메서드를 호출하면 컴파일러는 항상 같은 시그니처의 확장 메서드보다 기존 멤버 메서드를 우선해서 선택해요.

예시 (Example)

class Person

object PersonOps:
  extension (p: Person) def toString: String = "custom"

에러 (Error)

-- [E194] Potential Issue Warning: example.scala:4:28 --------------------------
4 |  extension (p: Person) def toString: String = "custom"
  |                            ^
  |Extension method toString will never be selected from type Person
  |because Person already has a member with the same name and compatible parameter types.
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | Although extensions can be overloaded, they do not overload existing member methods.
  | An extension method can be invoked as a regular method, but if that is the intended usage,
  | it should not be defined as an extension.
  |
  | The extension may be invoked as though selected from an arbitrary type if conversions are in play.
   -----------------------------------------------------------------------------

해결 방법 (Solution)

다른 메서드 이름을 사용해요.

class Person

object PersonOps:
  extension (p: Person) def toCustomString: String = "custom"

아니면 클래스 안에서 직접 메서드를 오버라이드해도 돼요.

class Person:
  override def toString: String = "custom"