我最近在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
答案 0 :(得分:4)
Scala没有像这样的地图文字。但是,以下内容应该有效:
val mapping: Map[String, _ <: Executable] = Map(
"/hello" -> new HelloWorldHandler(),
"/something" -> new SomeOtherHandler()
)
这只是使用Map
object的apply
方法创建新地图。
答案 1 :(得分:0)
您可以从Tuples2的通用Seq创建一个Map,但是没有从Tuple2到Map的自动转换。这非常有意义:你为什么要创建一个包含单个键和单个值的地图?