あなたはInt with String
を誤解:
をこれが生じた場所を迷っている場合、それはあなたが何かをすれば取得署名です。これはIntとStringの連合ではなく、交点であり、IntとStringの場合は空です。文字列である値のセットでIntである値のセットではなく、文字列の特性でIntの特性を持つ値のセットでもあります。そのような値はありません。
Either[Int, String]
を使用し、Map[Left(1) -> 2, Right("Hello") -> 3)
を使用できます。どちらも[連合]ではないが、A U Bではなく、差別化された連合であるA + Bである。[Int、Int]はIntと同じではないという違いを把握できる。実際には(Int、Boolean)と同型です:あなたはIntを持っていますが、あなたはどちらの側もそれを知っています。 AとBが互いに素(IntとStringのように)であるとき、A + BとA U Bは同形である。
または(心臓のかすかなものではない)あなたはMiles Sabinのa possible encoding of union typesを見ることができます。 (私はあなたが実際にクラスマップを使ってそれを使うことができないと確信していますが、あなたが試してみるよりもあまり確かではありませんが、読書は最も読書的です)。
編集:Int with String
バウンドあなたの下
、あなたの質問およびコードあまりにも速くを読んで申し訳ありませんので
Map[_ >: Int with String, Int]
、バウンド
Map[_ >: Nothing, Int]
と同じ低い
Nothing
ようで、
Nothing
と同じです暗黙のうちに、これは
Map[_, Int]
です。実際の
Map
は
Map[Any, Int]
です。あなたはブール型のキーを追加することもできました。
Map[Any, Int]
は
Map[_, Int]
とタイプすることができますので、val宣言が機能します。しかし、あなたの入力はキーのタイプに関するすべての情報を失います。キーの種類がわからない場合は、テーブルから何も追加(または取得)することはできません。
UpperBoundの方が良いとは言えませんでしたが、可能なキーはありません。最初のval宣言でさえ失敗します。
編集2:if (true) Map(1 -> 2) else Map("1" -> 2)
に関するこれはMap(1 -> 2, "1" -> 2)
と同じものではありません。それは簡単で、単純にMap[Any, Int]
となりました。は、より一般的な上位タイプのInt
とString
です。
一方、Map(1 -> 2)
はMap[Int, Int]
であり、Map["1", 2]
はMap[String, Int]
である。 Map[Int, Int]
とMap[String, Int]
の共通のスーパータイプを見つける問題は、共通のスーパータイプInt
とString
を見つけることができません。
実験をしましょう。 Map
は、その第2パラメータにおいて共変である。あなたが値ではなく、キーとしてInt
とString
を使用する場合:
if (true) Map(1 -> 2) else Map(1 -> "2")
res1: scala.collection.immutable.Map[Int, Any]
共分散では、それは単に、すべての型パラメータの共通スーパータイプになります。反変タイプでは
:B
はA
のサブタイプである場合には
class L[-T]
object L{def apply[T](t: T) = new L[T])
class A
class B extends A
class C
if (true) L(new A) else L(new C)
res2: L[A with C]
if (true) L(new A) else L(new B)
res3: L[B]
はそれが交差点A with C.
をとり、B
とA
はちょうどB
です。
は今、地図の非変異体のパラメータを持つ2つのタイプが関連している
if (true) Map(new A -> 1) else Map(new B -> 1)
res4: scala.collection.immutable.Map[_ >: B <: A, Int]
このようなタイプでは役に立ちません。タイプB
のキーで値にアクセスしたり、値を追加したりすることができます。しかし、キーA
の値にアクセスすることはできません。これはあなたが実際のマップ(true
のために)にあるように、厳しい運があります。 keySet
にアクセスすると、Set[A]
と入力されます。キーのタイプに関する情報が不完全で、できることは限られていますが、これは地図のタイプに関する知識が限られているため、必要な制限です。 Int and String
では最小限の情報が得られ、下限はAny
、上限はNothing
に相当します。 Nothing上限は、パラメータとしてキーをとるルーチンを呼び出すことができません。 Set[Any]
、Any
が下限であるkeySet
を引き続き取得できます。
これは問題ではないと思います。「Int with String」は、キー自体のタイプではなく、キーのタイプにバインドされています。他の多くの状況でそれを縛りとして使うことができます。 – Submonoid
ユニオンタイプのエンコーディングは素晴らしいことですが、特に質問には関係ありません。特に、私は割り当てが有効な理由に興味がありますが、他のものを追加しようとすると失敗します。 – Submonoid
私はそれが完全に役に立たないと思っています。 –