gpt4 book ai didi

scala - 涉及带有通配符的类型参数的奇怪编译错误

转载 作者:行者123 更新时间:2023-12-02 04:35:01 26 4
gpt4 key购买 nike

很抱歉,我无法将标题(或与此相关的问题)拟定得比这更有信息性,因为我不知道这里发生了什么。为什么这段代码不能编译:

 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协变,所以编译器会将 lres 类型设置为 List[Any]

并且由于您的代码片段 RupperboundFoo,所以 Foo 之间会发生冲突使用任何:

val res: Bar[Any] = bak.b //+R <: Foo

所以这个编译错误被抛出,在repl中它会自动分配bak.b到临时res> 变量。

关于scala - 涉及带有通配符的类型参数的奇怪编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44371409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com