특성을 감안할 때 T
추상 클래스/특성 및 불변 함수
trait T {
def v: Int
def +(t: T): T
}
다음 클래스 A
case class A(v: Int) extends T {
def +(a: A) = A(v + a.v)
}
은 T
의 유효한 하위 유형이 아닙니다. A.+
의 서명은 모든 구현이 A
유형의 객체뿐만 아니라 T
유형의 객체를 허용 할 수 있어야하지만 A.+
의 유형은 A
유형의 요소 만 허용하므로 A.+
의 구현은 너무 제한적입니다. 지금까지, 너무 합리적인.
T
의 구현을 제한적으로 허용하려면 다음과 같이 T
및 A
의 선언을 수정할 수 있습니다.
trait T[This <: T[This]] {
def v: Int
def +(t: This): This
}
case class A(v: Int) extends T[A] {
def +(a: A) = A(v + a.v)
}
분명히 형식 서명을 날려 버립니다.
T
의 구현이 자신의 유형의 객체와 호환되어야한다고 선언하는 또 다른 방법이 있습니까?
첫 번째 EDITLandei's answer below
실제로 회신하는 동안 현재 서명은 T
이 발생하는 다른 서명을 단축하지 않습니다.
trait C[D <: T[D], S] { self: S =>
def +(perm: D): S
def matches(other: S): Boolean
}
위의 "제 1 편집"을 참조하십시오. 그럼에도 불구하고, 나는 셀프 타입 주석을 전에 고려하지 않았다. –
나는 이것을위한 일반적인 해결책을 모른다. 의도와 클래스 계층 구조에 따라 유형 클래스 패턴 (암시 적 사용)이 적용될 수 있습니다 (예 : Numeric 참조). 또 다른 시도는 유형 변수 (D를 "내부"특성으로 끌어 들이기 위해)입니다. – Landei