typeパラメーターで共変であるContainerタイプがあります。
class Container[+T](val map: Map[Int, T] = Map.empty[Int, T]){
def add[B >: T](i: Int, b: B) = new Container(map + (i->b))
// lazy val freqs = (map.toList groupBy (x=>x._2) mapValues(_.size))
// lazy val uniq = map.toSet
lazy val keySet = map.keySet
}
freqsまたはuniquncommentedでコンパイルしようとするとエラーが発生する理由は、Spiewak氏がここでの回答に書いたことと関係があると考えていました。つまり、Set
sとMap
sは関連するパラメーターで不変です。
Scalaの不変セットがそのタイプで共変ではないのはなぜですか?
Set
ただし、タイプがTであるキーセットを含めるのに問題がないことに少し驚いていました。
私はこれを部分的に書くことで回避することができました
lazy val freqs:Map[_ <: Any, Int] =
(map.toList groupBy (x=>x._2) mapValues(_.size))
ただし、キータイプはAnyとして出力されるため、これは理想的とは言えません。私も言えるようになりたいです
lazy val uniqueValues = freqs.keySet
そして、のSet[T]
代わりにSet[Any]
- 上記のようにどのように実装するのが最適
freqs
ですか? keySet
他のメソッドが失敗した場合、どのようにSet [T]を返しますか?Set[T]
マップで一意の値を取得するにはどうすればよいですか?- なぜ_<:これをコンパイルできるのですか?
ありがとう!