1

在 python 中长期中断后,我最近回到了 scala,并试图再次围绕类型系统进行思考。我正在尝试制作一个非常简单的 Web URL 调度程序来再次熟悉该语言。到目前为止,我有:

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

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

我认为我在这里拥有的是 Scala 等效的接口 Executable 和实现该接口的类。现在我想创建一个 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()
)

这只是使用Mapobjectapply方法来创建一个新地图。

于 2012-06-12T19:17:03.950 回答
0

您可以从 Tuples2 的通用 Seq 创建 Map,但不会从 Tuple2 自动转换为 Map。这完全有道理:为什么要创建一个只有一个键和一个值的地图?

于 2012-06-12T22:12:50.423 回答