제거됨: 일반 타입 프로젝션
제거됨: 일반 타입 프로젝션 (General Type Projection)
Scala 2에서 허용되던 일반 타입 프로젝션 T#A는 Scala 3에서 사라졌어요. 무엇이 바뀌었고, 어떤 경우에 여전히 쓸 수 있는지 정리해 볼게요.
본문
Scala 2는 T가 임의의 타입이고 A가 T의 타입 멤버를 가리킬 때 일반 타입 프로젝션 T#A를 허용했어요. 그런데 이건 (적어도 다른 Scala 3 기능과 결합하면) unsound한 것으로 밝혀졌어요.
이를 해결하기 위해, Scala 3는 T가 구체 타입(concrete type, 즉 추상이 아닌 모든 타입)일 때만 타입 프로젝션을 허용해요. 그런 타입의 예로는 클래스 타입(class T)이 있어요. 타입이 추상(abstract)이 되는 경우는 다음과 같아요.
- 추상 타입 멤버(
= SomeType이 없는type T) - 타입 파라미터(
[T]) - 추상 타입에 대한 별칭(
type T = SomeAbstractType).A에는T의 멤버 타입이어야 한다는 사실 외에 제한이 없어요. 예를 들어 하위 클래스(class T { class A })가 그렇죠.
추상 타입에 대한 타입 프로젝션을 쓰는 코드를 다시 쓰려면 경로 의존 타입(path-dependent type)이나 암시적 파라미터를 고려해 보세요.
이 제한은 조합자 계산의 타입 레벨 인코딩을 배제해요.