类型参数[W]不符合特征类型参数边界

时间:2015-02-07 14:27:17

标签: scala scala-2.10

trait SomeClass {
    ...
}

trait AnotherClass[+V <: SomeClass] {
    ...
}

trait SomeAnotherClass[+V <: SomeClass] {
     protected def someFunc[W >: V](anotherClass: AnotherClass[W]) = {
          ...
     }
}

我收到此错误:

type arguments [W] do not conform to trait AnotherClass's type parameter bounds [+V <: SomeClass]
[error]   protected def someFunc[W >: V](anotherClass: AnotherClass[W]) = ...
[error]                                                    ^
[error] one error found

当我执行[W >: V <: SomeClass]而不是[W >: V]时,我不会收到错误,但在这种情况下,它会隐藏变量。请帮忙,如何解决这个问题。

更新

protected def someFunc(anotherClass: AnotherClass[V]) = {
              ...
}

我收到错误covariant type V occurs in contravariant position in type

1 个答案:

答案 0 :(得分:2)

当您说W >: V时,您说W的类型参数someFunc必须具有V的较低类型范围。这意味着W可以是V或其任何超类型,这将打破V <: SomeClass的类型范围。

例如Any >: SomeClass,因此在此假设情境中W可能是Any,但Any = V <: SomeClass也不是真的,因此类型边界会中断。

当您说W >: V <: SomeClass时,W下限为V 上限为SomeClass SomeClass W的上限非常重要,因为AnotherClass的包含类型的上限为SomeClass。如果没有它,它会尝试允许AnotherClass[Any](或其他一些非SomeClass的超类型,当然它不能。

你怎么解决这个问题?你有选择一种方法来做到这一点。您不能同时拥有W >: VAnotherClass[+V <: SomeClass]。它只是不起作用,因为类型边界冲突。