Set
として定義されSet[A]
ます。インバリアントパラメーターを取ります。共変引数を渡しているため、以下を実行すると期待どおりに機能します。
scala> val a = Set(new Object)
a: scala.collection.immutable.Set[Object] = Set(java.lang.Object@118c38f)
scala> val b = Set("hi")
b: scala.collection.immutable.Set[String] = Set(hi)
scala> a & b
<console>:10: error: type mismatch;
found : scala.collection.immutable.Set[String]
required: scala.collection.GenSet[Object]
Note: String <: Object, but trait GenSet is invariant in type A.
You may wish to investigate a wildcard type such as `_ <: Object`. (SLS 3.2.10)
a & b
しかし、以下は機能します:
scala> Set(new Object) & Set("hi")
res1: scala.collection.immutable.Set[Object] = Set()
上記のように、scala コンパイラーは型に変換Set("hi")
されるSet[Object]
ため、機能します。
ここで型推論は何をしていますか? 誰かが動作を説明する仕様にリンクしてもらえますか?それは一般的にいつ発生しますか? そのような場合にコンパイル時エラーをスローするべきではありませんか? 同じ操作タイプの 2 つの異なる出力として。