我正在尝试在 Scala 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]
当我尝试编译它时,最后一条语句失败并出现编译器错误,表明我不匹配类型边界。但是在我看来,我是这样的,也许在我有 N[L, M] 和以前的 L <: B[L] 的地方,并不是推断 N[L, M] 中的 L 是相同的 L < : B[L],对于 M 也是如此。错误如下:
类型参数的种类 (A,T forSome { type T <: B[T] },E) 不符合类型参数的预期种类 (type M,type L,type N)。E 的类型参数与类型 N 的预期参数不匹配:类型 C 的边界 >:Nothing <:B[C] 比类型 L 的声明边界更严格 >:Nothing <:Any,类型 D 的边界 >:Nothing <:A 比类型更严格M 的声明边界 >:Nothing <:Any
val myMap = MyMap.empty[A, T forSome { type T <: B[T] }, E]
感激地收到任何建议。
谢谢 -