1. ホーム
  2. scala

[解決済み] なぜScalaのimmutable Setは型が共変しないのか?

2023-01-13 01:32:12

質問

編集 : 元の回答に基づいてこの質問を書き直しました。

その scala.collection.immutable.Set クラスはその型パラメタが共変でありません。これはなぜでしょうか?

import scala.collection.immutable._

def foo(s: Set[CharSequence]): Unit = {
    println(s)
}

def bar(): Unit = {
   val s: Set[String] = Set("Hello", "World");
   foo(s); //DOES NOT COMPILE, regardless of whether type is declared 
           //explicitly in the val s declaration
}

どのように解決するのですか?

Set は、関数としてのセットの背後にある概念のため、その型パラメータに不変である。 以下のシグネチャは物事を少し明確にするはずです。

trait Set[A] extends (A=>Boolean) {
  def apply(e: A): Boolean
}

もし Set が共変数であった場合 A で共変している。 apply 型のパラメータを受け取ることができません。 A 型のパラメータを取ることができません。 Set は潜在的に 反変 A のようにしたい場合、これも問題が発生します。

def elements: Iterable[A]

要するに、イミュータブルなデータ構造であっても、物事を不変に保つことが最良の解決策なのです。 お気づきのように immutable.Map はその型パラメータの一つでも不変であることに気づきます。