很抱歉,我无法将标题(或与此相关的问题)拟定得比这更有信息性,因为我不知道这里发生了什么。为什么这段代码不能编译:
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]
这是什么?为什么我可以使用变量,但不能给它赋值??? 这对任何人都有意义吗?
最佳答案
Covariant with Wildcard 类型,编译器会将res
的容器类型设置为Any
,比如:
scala> val l: List[_] = List(123)
l: List[_] = List(123)
scala> l
res1: List[Any] = List(123)
scala> :type l
List[Any]
如上代码,List
容器类型为_
,由于List
是协变,所以编译器会将 l
的 res
类型设置为 List[Any]
。
并且由于您的代码片段 R
是 upperbound 到 Foo
,所以 Foo
之间会发生冲突使用任何
:
val res: Bar[Any] = bak.b //+R <: Foo
所以这个编译错误被抛出,在repl中它会自动分配bak.b
到临时res> 变量。
关于scala - 涉及带有通配符的类型参数的奇怪编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44371409/