我很抱歉,我无法制定标题(或有关此问题的问题),因为我不知道这里发生了什么。为什么不编码:奇怪的编译错误涉及带有通配符的类型参数
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]
这是什么?为什么我可以使用该变量,但不能将它分配给一个val? 这对任何人都有意义吗?
你可以绑定通配符类Bak(val b:Bar [_ <:Foo])',尽管我不知道它为什么会等待错误。即使将它设置为通配符val似乎也不起作用。 –
@MichaelZajac很好,是的......我也可以做'class Bak(val v:Bar [Foo])',因为协变性,这几乎是相同的东西。我认为,在这种情况下使用通配符的唯一原因是简洁 - 所以人们不必拼写出'Foo'..但是必须明确写出边界来否定该目的:( – Dima
'Bar [_]'默认为'Bar [_ <:Any]'根据SLS 3.10占位符的语法,这很奇怪,错误只在分配给某个值时才显示出来 –