E208: Extension Has Default Receiver
E208: Extension Has Default Receiver
이 경고는 확장 메서드가 리시버(receiver) 파라미터에 기본 인자를 가질 때 발생해요. 확장 메서드가 객체에 대한 선택으로 호출될 때 기본값은 절대 사용되지 않기 때문에 권장되지 않아요.
본문
확장 메서드는 일반적으로 receiver.method()처럼 호출되는데, 이때 리시버는 항상 제공돼요. 리시버의 기본 인자는 메서드를 일반 함수로 호출할 때만 의미가 있어요. 그런 경우라면 애초에 확장으로 정의하면 안 되겠죠.
예시 (Example)
extension (s: String = "hello, world") def invert = s.reverse.toUpperCase
에러 (Error)
-- [E208] Potential Issue Warning: example.scala:1:23 --------------------------
1 |extension (s: String = "hello, world") def invert = s.reverse.toUpperCase
| ^
|Extension method invert should not have a default argument for its receiver.
|-----------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| The receiver cannot be omitted when an extension method is invoked as a selection.
| A default argument for that parameter would never be used in that case.
| 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.
-----------------------------------------------------------------------------
설명 (Explanation)
확장 메서드가 선택으로 호출될 때 리시버는 생략될 수 없어요. 그 경우 해당 파라미터의 기본 인자는 절대 사용되지 않아요. 확장 메서드는 일반 메서드로 호출될 수도 있지만, 그것이 의도된 용법이라면 확장으로 정의하면 안 돼요.
해결 방법 (Solution)
리시버 파라미터에서 기본 인자를 제거해요.
extension (s: String) def invert = s.reverse.toUpperCase
기본 인자가 있는 함수가 필요하다면 확장 대신 일반 메서드로 정의해요.
def invert(s: String = "hello, world"): String = s.reverse.toUpperCase
참고로 확장 메서드에서는 리시버가 아닌 파라미터에 기본 인자를 허용해요.
extension (s: String)
def combine(other: String = ", world") = s + other