E123: Type Test Always Diverges — 항상 발산하는 타입 테스트 경고
E123: Type Test Always Diverges — 항상 발산하는 타입 테스트 경고
스크루티니(scrutinee)의 타입이 값을 절대 가질 수 없는 타입일 때 타입 테스트를 수행하면, 컴파일러가 이 경고를 냅니다.
본문
이 경고는 isInstanceOf나 패턴 매칭 같은 타입 테스트를 수행할 때, 스크루티니의 타입이 어떤 값도 담을 수 없는 타입이라서 테스트가 결과를 절대 반환할 수 없을 때 발생해요.
이런 경우는 보통 스크루티니의 타입이 Nothing일 때 나타나요. 예를 들어 ???, throw, 또는 명시적으로 Nothing으로 타입을 붙인 값 같은 경우죠. Nothing은 인스턴스가 없으므로 타입 테스트는 절대 완료될 수 없어요. 스크루티니를 평가하는 순간 테스트가 수행되기 전에 항상 발산(divergence)해버려요.
예시
def example: Boolean = ???.isInstanceOf[String]
에러
-- [E123] Syntax Warning: example.scala:1:39 -----------------------------------
1 |def example: Boolean = ???.isInstanceOf[String]
| ^^^^^^^^^^^^^^^^^^^^^^^^
|This type test will never return a result since the scrutinee type (??? : => Nothing) does not contain any value.
해결 방법
값을 담을 수 있는 타입을 쓰면 돼요.
// Use a type that can contain values
def example(x: Any): Boolean = x.isInstanceOf[String]
아니면 이 코드 경로가 도달할 수 없다는 사실을 인정하고, 테스트를 생략해도 돼요.
// Or acknowledge that the code path is unreachable
def example: Boolean = ??? // Returns Nothing, no type test needed