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

标签 scala generics wildcard covariance

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

 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/

相关文章:

c# - 在 C# 中使用泛型和 Func 避免代码重复的最佳方法

Java 泛型,创建 Class<T> 的实例

java - 在 Swagger 中使用泛型处理特殊情况

solr - 在 Solr 或 ElasticSearch(尤其是 websolr 或 bonsai.io)中使用根扩展器进行邻近搜索短语?

scala - 如何设置 Play! 的 POST header 2.0 web服务查询?

scala - 可选字段,ADT,还是?

java - Java 类型推断何时产生无限类型?

apache - 用于嵌套子域的 OpenSSL 和 apache2 通配符自签名证书

scala - 具有最大位数的字符串格式

scala - 当参数列表相同时,将一个 case class 转换为另一个 case class