1

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氏がここでの回答に書いたことと関係があると考えていました。つまり、SetsとMapsは関連するパラメーターで不変です。

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]マップで一意の値を取得するにはどうすればよいですか?
  • なぜ_<:これをコンパイルできるのですか?

ありがとう!

4

1 に答える 1

3

しかし、タイプがTのセットを返すkeySetを含めても問題がないことに少し驚いていました。

いいえ、違います。mapはタイプMap[Int, T]であるため、そのはタイプですがTキーはタイプIntです。したがって、keySetここではタイプSet[Int]ではなく )であり、これはの共分散Set[T]に問題がないことを意味します。T

他のメソッドが失敗した場合、keySetはどのようにSet [T]を返しますか?

そうではありません(上記を参照)

マップ内の一意の値のSet[T]を取得するにはどうすればよいですか?

Setそれがその型パラメーターで不変であることを考えると、これらのvalをとしてマークするか、で不変にしない限り、Set[T]内部に型のvalを含める方法はありません。Containerprivate[this]ContainerT

上記のように周波数を最適に実装するにはどうすればよいですか?

上記と同じ問題。

なぜ_<:これをコンパイルできるのですか?

freqそれがタイプであると明示的に述べる場合Map[_ <: Any, Int]、への依存関係を削除したためT、分散に関する限り問題はありません。のタイプを明示的に述べていない場合freq、scalaはタイプを(正しく)推測します。Map[T, Int]これは不変の位置に依存します。T

于 2013-02-20T23:57:13.210 に答える