【发布时间】:2017-11-06 08:56:34
【问题描述】:
抱歉,我无法将标题(或与此相关的问题)表述得比这更能提供信息,因为我不知道这里发生了什么。为什么这段代码无法编译:
class Foo
class Bar[+R <: Foo] { def bar = "bar" }
class Bak(val b: Bar[_])
val bak = new Bak(new Bar[Foo])
bak.b.bar // fine
println(bak.b) // fine
bak.b // oops!
^^^ type arguments [Any] do not conform to class Bar's type parameter bounds [+R <: Foo]
这是什么?为什么我可以使用变量,但不能给它赋值??? 这对任何人都有意义吗?
【问题讨论】:
-
你可以绑定通配符
class Bak(val b: Bar[_ <: Foo]),虽然我不知道为什么它会等待错误。即使将其设置为通配符 val 似乎也不起作用。 -
@MichaelZajac 好吧,是的......我也可以只做
class Bak(val v: Bar[Foo]),因为协方差,这几乎是一样的。我认为,在这种情况下使用通配符的唯一原因是简洁——这样就不必拼出Foo.. 但是必须明确地写出边界会破坏这个目的:( -
Bar[_]根据 SLS 3.10 占位符语法默认为Bar[_ <: Any]。奇怪的是,错误只在被分配给一个值时才出现。
标签: scala generics wildcard covariance