类型参数不符合特征Bar的类型参数边界

时间:2015-02-07 20:00:03

标签: scala scala-2.10

scala> trait Foo
defined trait Foo

scala> trait Bar[+V <: Foo]
defined trait Bar

scala> trait Baz[+V <: Foo] {
     |    def print[W >: V](bar: Bar[W]) = println("hello bar")
     | }
<console>:10: error: type arguments [W] do not conform to trait Bar's type parameter bounds [+V <: Foo]
          def print[W >: V](bar: Bar[W]) = println("hello bar")

scala> trait Baz[+V <: Foo] {
     |    def print[W >: V <: Foo](bar: Bar[W]) = println("hello bar")
     | }
defined trait Baz

有人可以解释为什么[W >: V]不起作用吗?以及如何使它工作?为什么最后一个案例正在发挥作用。

1 个答案:

答案 0 :(得分:1)

Bar的定义将V约束为Foo或其子类型。 W被限制为V超类型。好吧,有一些V的超类型在继承层次结构中高于Foo,对于那些类型Bar强加于V的约束不适用。

我们可以通过从左到右描述继承层次结构来以图形方式显示:

Any, AnyRef, Foo, SomeFooSubType, ...
             V    V                V, ...  (V could be any of these)
                  ^  (let's say it's this one, to illustrate)
W,   W,      W,   W  (then W could be any of these)
^    ^   (but these two violate the constraint that Bar imposes)

也许在另一个问题中,您可以说出您要做的事情并询问该怎么做?