이기종 기본 유형을 그룹화하기위한 일반 래퍼 문제를 다시 검토합니다. 나는 형의 멤버를 사용하고, 이제 구조는 다음과 같습니다가변 유형 검사/패턴 일치 (가변 유형 유형 포함)
trait Outer[S] {
type A1
def inner: Inner[S] { type A = A1 }
}
trait Inner[S] {
type A
def peer: A
}
물론 특정 개체를 테스트하는 것입니다 다음 문제, 예를 들면 :
def test[S](o: Outer[S]): Option[Outer[S] { type A1 = String }] = o match {
case os: Outer[S] { type A1 = String } => Some(os)
case _ => None
}
이 때문에 유형이 작동하지 않습니다 지워 없앰. 문제는 피어에 대해 형식 매개 변수를 추상화해야한다는 것입니다. 즉 하나의 형식 매개 변수 [S]
을 가진 (대부분의) 피어가 있지만 다른 피어에는 없습니다. 따라서 Inner
및/또는 Outer
에 대한 형식 생성자 매개 변수를 사용하는 것은 적합하지 않습니다.
싼 솔루션은 실제 하위 클래스를 필요로하는 것입니다
trait StringOuter[S] extends Outer[S] { type A1 = String }
def test1[S](o: Outer[S]): Option[Outer[S] { type A1 = String }] = o match {
case os: StringOuter[S] => Some(os)
case _ => None
}
을하지만 다른 동료을 많이 가지고 있기 때문에 나는이 솔루션을 좋아하지 않아, 나는 전용 랩퍼를 작성하지 않으 각자의 수업. 또한 예를 들어, 이러한 모든 하위 클래스에 복사 메서드를 작성해야한다면 이러한 개체를 복사하는 것이 짜증나게됩니다.
아마도 클래스 태그가 남았습니까?
trait Foo[S]
type Inner1[S] = Inner[S] { type A = Foo[S] }
type Inner2[S] = Inner[S] { type A = String }
: 나는 다른 종류의 매개 변수 arity에 다음과 같은 두 피어 유형이있는 경우 이것은 어떻게 해결 될 것인가? 우리가 잠시 일치하는 패턴에 대해 잊어 버린 경우