E186: Implausible Pattern Warning — 말이 안 되는 패턴 경고

E186: Implausible Pattern Warning — 말이 안 되는 패턴 경고

패턴 매치의 case가 그럴듯하지 않을 때(implausible) 발생하는 경고예요. 즉, 서로 무관한 두 타입의 요소를 식별해주는 커스텀 equals 메서드가 있을 때만 패턴이 셀렉터 타입과 매칭될 수 있는 경우를 말해요.

출처: Scala 3 Reference

본문

이 경고는 주로 무관한 타입의 싱글턴 객체나 값에 대해 매칭할 때 발생해요. Java의 equals 의미 덕분에 기술적으로는 가능하지만 의도적일 가능성이 낮은 패턴이에요.

이 경고는 -Wimplausible-patterns 컴파일러 플래그가 필요해요.

예시 (Example)

//> using options -Wimplausible-patterns

abstract class Recovery
object Recovery extends Recovery

abstract class TypedRecovery
object TypedRecovery extends TypedRecovery

def example(x: TypedRecovery): Unit = x match
  case Recovery => println("Recovery")
  case TypedRecovery => println("TypedRecovery")

에러 (Error)

-- [E186] Type Warning: example.scala:10:7 -------------------------------------
10 |  case Recovery => println("Recovery")
   |       ^^^^^^^^
   |Implausible pattern:
   |Recovery  could match selector of type  TypedRecovery
   |only if there is an `equals` method identifying elements of the two types.

해결 방법 (Solution)

의도한 게 아니라면 그럴듯하지 않은 패턴을 제거하세요:

//> using options -Wimplausible-patterns

abstract class Recovery
object Recovery extends Recovery

abstract class TypedRecovery
object TypedRecovery extends TypedRecovery

def example(x: TypedRecovery): Unit = x match
  case TypedRecovery => println("TypedRecovery")

둘 다 매칭해야 한다면 공통 슈퍼타입을 사용하세요:

//> using options -Wimplausible-patterns

trait RecoveryEvent

abstract class Recovery extends RecoveryEvent
object Recovery extends Recovery

abstract class TypedRecovery extends RecoveryEvent
object TypedRecovery extends TypedRecovery

def example(x: RecoveryEvent): Unit = x match
  case Recovery => println("Recovery")
  case TypedRecovery => println("TypedRecovery")

더 알아보기

무관한 타입의 싱글턴 객체를 매칭하면 실제로는 equals에 의존하는 이상한 매칭이 돼요. 공통 슈퍼타입으로 맞춰주는 게 안전해요.