0

Scalaの共分散と反分散を把握しようとしています。このようなクラスのセットがあります Message1 と Message2 は Message のサブタイプです

sealed trait Parser[T <: Message]{
  //... blah blah
}

class Parser1 extends Parser[Message1]{
}

class Parser2 extends Parser[Message2]{
}

これで、不変のマップにマッピングを格納する別のモジュール (ファクトリ) ができました。

var myMap = Map[String,Parser[Message]()
myMap += Map("Message1" -> new Parser1)
myMap += Map("Message2"-> new Parser2)

今、これはコンパイルされません。私は何が欠けていますか?

これは私が得るコンパイルエラーです

[error]  found   : scala.collection.immutable.Map[java.lang.String,s.p.h.m.Parser1]
[error]  required: (String, s.p.h.m.Parser[c.s.m.Message])
[error]   myMap += Map("Message1" -> new Parser1)
4

2 に答える 2

2

++=別のマップのエントリをマップに追加する必要があることはすでに見ました+が、 は単一のエントリ (キーと値のタプル) を取ります。を保持したい場合は、が のサブタイプと見なされるようにが共変でvarあることを確認する必要があります( の結果は、既存のエントリと新しいエントリの最も近いスーパータイプになるため、この場合は残り、したがって、再び に保存できます):ParserTParser[Message1]Parser[Message]+Map[String,Parser[Message]]myMap

trait Message; class Message1 extends Message; class Message2 extends Message

sealed trait Parser[+T <: Message]  // !
class Parser1 extends Parser[Message1]
class Parser2 extends Parser[Message2]

var myMap = Map.empty[String,Parser[Message]]
myMap += "Message1" -> new Parser1
myMap += "Message2"-> new Parser2
myMap ++= Map( "Message1b"-> new Parser1, "Message2b"-> new Parser2 )
于 2012-09-14T06:19:55.643 に答える
2

あなたが得ているエラーは何ですか?Parserクラス階層が原因で、ここに型エラーがあるようには見えません。

ただし、不変のマップを変更しようとしているようで、エラー発生します。また、新しいマップではなく、マップ ペアをマップに追加する必要があります。代わりにこれを試してください:

val myMap = Map[String,Parser]()
val myMap1 = myMap + ("Message1" -> new Parser1)
val myMap2 = myMap1 + ("Message2" -> new Parser2)

更新ごと+=に新しいものを作成する代わりに本当に使用したい場合は、デフォルトの (不変の) マップ タイプの代わりに使用できます。valscala.collection.mutable.Map

于 2012-09-13T18:47:32.403 に答える