2016-10-13 7 views
0

スカラーアプリケーションでリファクタリングを実行している間に、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より制限された型」のリストを引数として渡すことを可能にする型の違いですが、ケースではそうではありません を設定しますか?
  • この違いは、型間のキャストや変換を妨げるだけですか?
  • これは主に、コンパイラの "制限"または不変型の予想されるプロパティですか?
  • "実際には"インバリアント型の間に他に違いはありますか?それともこのようなキャストに至るのですか?

答えて

0

1)これは、ここで説明しています: Why is Scala's immutable Set not covariant in its type?

基本的には、セット[T]もFunction1[T, Boolean]です。 Function1のシグニチャは[-In, +Out]であるため、Tは、scalaがバイナリを許さない(これは型システムを著しく弱める)と同時に+T-Tの両方になることはできませんでした。

2).toSet[Any]asInstanceOfを超えるラッパー)を使用して簡単にキャストできます。 skip variance checkへの道もあります。

3,4)これはジェネリック(多型)型の予想されるプロパティです。それらは不変的/共変的/反変的(だけではない)であり、単純な規則によって形式的に記述される。あなたはここで説明を読むことができます:https://stackoverflow.com/a/27627891/1809978

+0

リンクされた回答のすべての他の返信を読んだ後、私はそれの周りに私の脳を持って以来、あなたの答えを受け入れます。1)の実際の違いはSetが不変である理由を説明します(また、不変のキーを持つMapsを使って実装されているためです)。 – negative

関連する問題