特征和泛型的Scala类型错误

时间:2012-06-12 19:01:18

标签: scala

我最近在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

2 个答案:

答案 0 :(得分:4)

Scala没有像这样的地图文字。但是,以下内容应该有效:

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

这只是使用Map objectapply方法创建新地图。

答案 1 :(得分:0)

您可以从Tuples2的通用Seq创建一个Map,但是没有从Tuple2到Map的自动转换。这非常有意义:你为什么要创建一个包含单个键和单个值的地图?