2016-06-28 7 views
0

これがなぜ機能しないのか理解してもらえますか? Scalaのバージョン2.10マップ上のキーとしての特性をスカラでシールすると、不一致エラーが発生する

object ColorEnum { 
    sealed trait Color 
    case object Red extends Color 
    case object Blue extends Color 
    case object Green extends Color 
} 

キーなどの色や値として文字列を受け取り地図の作成は

val colorMap = mutable.HashMap[ColorEnum.Color, String]() 

キー

colorMap.put(ColorEnum.Red, "Foo") 

このようColorEnumを使用して地図上のアイテムを置きます例外をスローする

error: type mismatch 
found: ColorEnum.Red.type 
required: ColorEnum.Color 

これはどのように動作するのか分かっています。

おかげ

+0

他の関連トピックへのリンクを提供することで、ケースクラスをキーとして使用する方法の例を既に公開しています。 – Kamil

+2

これは私のためにコンパイルします。これはあなたが使用しているコードですか? –

+0

'object ColorEnum'階層の外にtraitとcaseオブジェクトを定義するとします。次に、 'colorMap.put(Red、" Foo ")'を使ってマップを 'val colorMap = mutable.HashMap [Color、String]()'として定義します。封印された特性を作成するColorEnum内のColorオブジェクトとCaseオブジェクトは、少なくとも私にとっては機能しません。 – user943583

答えて

2

概要:(バック2.8とスカラのすべての先行バージョン)スカラ2.11のよう
MapのキーはMap[A, +B]タイプAあります。そして、キーは、キーを指定するときに共分散を許さない。すなわち、Aがその前にプラス記号(+)を持たないことに気付く。 https://stackoverflow.com/a/678637/501113

詳細:

はここで詳細に対処し、特定のStackOverflowの答えだ
あなたの特性、Color、あなたのMapを定義していることにより、タイプです。そして、あなたはColor形質の子孫をと定義します。次に、Color形質の子孫(形質のインスタンスとは対照的に)をMapに挿入しようとしています。また、Mapの型定義では、子孫ではなくColorの直接インスタンスのみが許可されます(extendsまたはwithによって定義されます)。

Mapのキーのタイプ要件に準拠するために、子孫キーをMapに挿入するときは.asInstanceOf[Color]を使用できます。しかし、このアプローチを使用することは望ましくないコードの匂いとみなされることに注意してください。

ボーナス:
あなたがあなた自身の強く型付けされた列挙を定義しようとしている表示されます。 this answer to a related question regarding defining enumerations in Scalaをご覧ください。

関連する問題