我有一个类型 Foo,有子类型。
我有另一个类,其中包含一个 Foo:
class FooResult(val foo: Foo ...
我有一组 FooResult,我希望用 map() 将 Foos 从中拉出,然后计算该 Set (Foos) 和另一组 Foos 之间的差异。下面的“结果”是一个 Set[FooResult] 并且 - 这是关键部分 - bundle 是一个 Set[_ <: Foo]
val completedFoos = results.map(result => result.calc)
val unfinishedFoos = bundle.foos.diff(completedCalcs)
第二行不会编译。当 bundle 是 Set[Foo] 而不是 Set[_ <: Foo] 时,它工作得很好——引入协方差把事情搞砸了。这是错误:
type mismatch;
found : Set[Foo]
required: scala.collection.GenSet[_$1]
Note: Foo >: _$1, but trait GenSet is invariant in type A.
You may wish to investigate a wildcard type such as `_ >: _$1`. (SLS 3.2.10)
我还没有找到任何简单的方法来解决这个问题。原谅我的无知,但是为什么像 GenSet 这样的“辅助”类型会被声明为不变的呢?
我是否遗漏了某些东西(很可能),或者这是否是 Scala 奇妙的集合框架的弱点(我认为不太可能)?