スカラーアプリケーションでリファクタリングを実行している間に、ListからSetに変更すると、以前は持たなかった質問が発生しました。私は分散についていくつかのアイデアを持っていますが、コンパイラが何を意味するのかを正確に理解したいと思います。Scala Set、不変型はどうなっていますか?
私はうまくコンパイルして動作しますこれに似たもの、持っていた:そして、私は設定して私のリストを変更し
case class MyClassList(s: List[Any])
val myList = List(("this", false)) // List[(String, Boolean)]
val listWorks = MyClassList(myList)
を:
case class MyClassSet(s: Set[Any])
val mySet = Set(("this", false)) // Set[(String, Boolean)]
val setFails = MyClassSet(mySet)
をこの時点で、MyClassSet型のオブジェクトを作成しますSetのいずれかを受け入れる場合でも、Setを引数として渡してもらえなくなりました。さて、それは(セットは、以前のマイセットとして、「同じ」であることに注意してください)以下のときが働いて少し混乱だ:
val setWorks1 = MyClassSet(Set(("this", false)))
私は簡単な説明は、コンパイラとしてMYSETのvalを推測していることであると信じています[(String、Boolean)]を設定しますが、SetWorks1の引数リストで直接インスタンス化すると、Set [Any]を受け付けるため、コンパイラはSet [Any]として推論します。これにより、最初の例は失敗し、2番目の例は失敗します。
がval setWorks2 = MyClassSet(mySet.toSet[Any])
val mySetOfAny: Set[Any] = Set(("this", false), ("that", true), ("other", false))
val setWorks3 = MyClassSet(mySetOfAny)
コンパイラによって示される実際のエラーがある:次のように
Error:(15, 55) type mismatch;
found : Set[(String, Boolean)]
required: Set[Any]
Note: (String, Boolean) <: Any, but trait Set is invariant in type A.
You may wish to investigate a wildcard type such as `_ <: (...)
リスト及びセットが定義されています。これらのものはまた、以前は正しいことを指しており、動作
type List[+A] = scala.collection.immutable.List[A]
type Set[A] = immutable.Set[A]
- この違いは、「Anyより制限された型」のリストを引数として渡すことを可能にする型の違いですが、ケースではそうではありません を設定しますか?
- この違いは、型間のキャストや変換を妨げるだけですか?
- これは主に、コンパイラの "制限"または不変型の予想されるプロパティですか?
- "実際には"インバリアント型の間に他に違いはありますか?それともこのようなキャストに至るのですか?
リンクされた回答のすべての他の返信を読んだ後、私はそれの周りに私の脳を持って以来、あなたの答えを受け入れます。1)の実際の違いはSetが不変である理由を説明します(また、不変のキーを持つMapsを使って実装されているためです)。 – negative