サブタイプを持つ Foo 型があります。
とりわけ Foo を含む別のクラスがあります。
class FooResult(val foo: Foo ...
FooResult のセットがあり、map() を使用してそこから Foo を取り出し、(Foo の) セットと別の Foo のセットとの差分を計算したいと考えています。以下の「結果」は Set[FooResult] であり、これが重要な部分です。バンドルは Set[_ <: Foo] です。
val completedFoos = results.map(result => result.calc)
val unfinishedFoos = bundle.foos.diff(completedCalcs)
2 行目はコンパイルされません。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 のすばらしいコレクション フレームワークの弱点なのでしょうか (非常にありそうにないと思います)。