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]
不起作用吗?以及如何使它工作?为什么最后一个案例正在发挥作用。
答案 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)
也许在另一个问题中,您可以说出您要做的事情并询问该怎么做?