스칼라 2.9.2에서 맵핑 된 래퍼를 더 높은 종류의 유형을 가진 값으로 만들고 유형 시스템과 관련되어 있습니다. 여기에 문제가 설명하는 코드의 삭감 버전 : 나는 시도하고이를 컴파일 할 때스칼라의 일치하는 유형 제약 조건이 실패합니다.
trait A
trait B[C] {
def c: C
}
trait E[C <: B[C], D <: A]
case class MyMap[M <: A, L <: B[L], N[L, M]](map: Map[M, N[L, M]])
object MyMap {
def empty[M <: A, L <: B[L], N[L, M]] = MyMap(Map.empty[M, N[L, M]])
}
val myMap = MyMap.empty[A, T forSome { type T <: B[T] }, E]
이 마지막 문장은 I 형 경계와 일치하지 않는하고 있음을 나타냅니다 컴파일러 오류와 함께 실패합니다. 그러나 나는 나처럼 보입니다. 아마도 N [L, M]이고 이전에 L < : B [L] 였을 것입니다. N [L, M]의 L이 동일하다는 것을 추측하지 못합니다 L < : B [L]를 한 다음, 마찬가지로 M. 오차대로 다음을 따르지 않는 : 타입 인자 (E A, T forSome {B [T] 타입 T <이})의
가지 예상되는 종류의 유형 매개 변수 (유형 M, 유형 L, 유형 N). 유형의 매개 변수가 유형 N의 예상 매개 변수와 일치하지 않습니다. 유형 C의 경계> : 없음 < : B [C]가 유형 L의 선언 된 경계보다 더 엄격합니다. < : 임의, 유형 D의 경계> : 없음 < : A가 유형보다 엄격합니다. 아무것도 < : M의는 경계>를 선언 된
발에는 myMap = MyMap.empty [A, T forSome {T 형 < : B [T]}, E]
감사받은 어떤 조언.
감사합니다 - 일 두 번째 매개 변수에 문제가 세 번째로 하나가
덕분 경우
마찬가지로, 코드는 (당신이 적당한 두 번째 매개 변수를 전달 제공) 작동합니다. 당신의 예제와 나의 특성 B를 사용하여, C가'클래스 C [X <: B [X]] {}'로 정의된다면, 어떻게 함수 g를 정의하겠습니까? – fhusbdef g [X [Y [: B [Y]] (마지막 줄의 빈칸과 마찬가지로 N [X <: B [X] ...) –
감사합니다. 그렇다면 C에 대한 것보다 더 이상 제약이없는 C의 목록을 말하고 싶다면 (이것이 일단 제거되면 실제 문제라고 생각합니다).나는 타입 인자 [T forSome {type T <: B [T]}]로 불평하는'val {List [C [T forSome {type T <: B [T]}]()'를 시도했다. 클래스 C의 유형 매개 변수 bounds [X <: B [X]] "를 준수합니다. – fhusb