1

私は最近、Pythonでの長い休止の後、型システムに再び頭を悩ませようとして、scalaに戻りました。言語に再び慣れるために、非常に単純なWebURLディスパッチャーを作成しようとしています。これまでのところ:

trait Executable {
  def execute(request: HttpRequest, response: HttpResponse): Future[HttpResponse]
}

class HelloWorldHandler extends Executable {
  override def execute(request: HttpRequest, response: HttpResponse) = {
    Future.value(response)
  }
}

私がここに持っていると思うのは、Executableインターフェースとそのインターフェースを実装するクラスに相当するscalaです。次に、次のようなハンドラーへのURLのマッピングを作成します。

val mapping: Map[String, _ <: Executable] = {
  "/hello" -> new HelloWorldHandler()
}

これをコンパイルすると、次のエラーが発生します。

type mismatch;
   found   : (java.lang.String, pollcaster.handlers.HelloWorldHandler)
   required: Map[String,pollcaster.Executable]
           "/" -> new HelloWorldHandler()
                  ^

ここでの理解がどこで間違っていたかはわかりませんが、Executableの特性を持つさまざまなクラスをマップオブジェクトに配置する方法を理解するのに役立ちますか?

TIA

4

2 に答える 2

4

Scalaにはそのようなマップリテラルはありません。ただし、以下は機能するはずです。

val mapping: Map[String, _ <: Executable] = Map(
  "/hello" -> new HelloWorldHandler(),
  "/something" -> new SomeOtherHandler()
)

これは、Mapオブジェクトapplyメソッドを使用して新しいマップを作成するだけです。

于 2012-06-12T19:17:03.950 に答える
0

Tuples2の汎用Seqからマップを作成できますが、Tuple2からMapへの自動変換はありません。それは完全に理にかなっています。なぜ、単一のキーと単一の値でマップを作成するのでしょうか。

于 2012-06-12T22:12:50.423 に答える