제거됨: 존재 타입
제거됨: 존재 타입 (Existential Types)
forSome을 쓰는 존재 타입(existential type)은 Scala 3에서 제거됐어요. 기존 Scala 2 코드에서 이 타입을 잘 쓰고 있었다면, 왜 빠졌고 어떤 방식으로 바뀌는지 짚어둘 필요가 있어요.
본문
SLS §3.2.12에 정의된 forSome을 이용한 존재 타입은 제거됐어요. 제거한 이유는 다음과 같아요.
- 존재 타입은 DOT와 Scala 3가 기반으로 삼는 타입 건전성(type soundness) 원리를 위반해요. 그 원리는 타입 선택
p.T나S#T의 모든 접두부(p, 각각S)가 런타임에 생성된 값에서 오거나, 좋은 바운드만 가진다고 알려진 타입을 가리켜야 한다는 내용이에요. - 존재 타입은 다른 Scala 구성 요소와 많은 어려운 상호작용을 만들어냈어요.
- 존재 타입은 경로 의존 타입(path-dependent type)과 겹치는 부분이 커서, 유지하는 이득이 상대적으로 작았어요.
와일드카드만으로 표현할 수 있는 존재 타입(즉 forSome은 쓰지 않는 경우)은 여전히 지원되지만, 세련된 타입(refined type)으로 취급돼요. 예를 들어 다음 타입은
Map[_ <: AnyRef, Int]
Map 타입으로 취급되는데, 첫 번째 타입 파라미터는 AnyRef를 상한으로 두고 두 번째 타입 파라미터는 Int의 별칭이에요.
Scala 2로 컴파일된 클래스 파일을 읽을 때 Scala 3는 존재 타입을 자기 방식의 타입으로 최대한 근사하려고 해요. 다만 정확한 모사는 불가능하다는 경고를 내보냅니다.