Set
定义为Set[A]
。它需要一个不变的参数。当我们传递协变参数时,执行以下操作按预期工作:
scala> val a = Set(new Object)
a: scala.collection.immutable.Set[Object] = Set(java.lang.Object@118c38f)
scala> val b = Set("hi")
b: scala.collection.immutable.Set[String] = Set(hi)
scala> a & b
<console>:10: error: type mismatch;
found : scala.collection.immutable.Set[String]
required: scala.collection.GenSet[Object]
Note: String <: Object, but trait GenSet is invariant in type A.
You may wish to investigate a wildcard type such as `_ <: Object`. (SLS 3.2.10)
a & b
但以下工作:
scala> Set(new Object) & Set("hi")
res1: scala.collection.immutable.Set[Object] = Set()
如我所见,scala编译器转换Set("hi")
为Set[Object]
类型并因此工作。
类型推断在这里做什么?有人可以链接到说明该行为的规范以及它一般何时发生吗?对于这种情况,它不应该引发编译时错误吗?作为相同操作类型的 2 个不同输出。