2012-06-12 34 views
1

我最近已经返回scala之后,在python长期中断,并试图再次围绕类型系统我的思想。我正在尝试制作一个非常简单的网址调度程序,以便再次熟悉该语言。到目前为止,我有:Scala类型错误与特征和泛型

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

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

我觉得我这里是斯卡拉相当于一个接口可执行和实现该接口的类的。现在,我想创建的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() 
       ^

我不知道我哪里错了在我的理解这里,但将不胜感激任何帮助了解如何可以将一堆具有可执行特性的不同类放入地图对象中?

TIA

回答

4

斯卡拉没有这样的地图文字。以下应工作,虽然:

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

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

+0

工作!我想我的脑子上有太多的蟒蛇。 – dhable

0

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

+1

我一直在创建带有单个键值对的地图(并非真的,我猜,但我之前有过,而且这不是一件完全不合理的事情)。更有可能不存在隐式转换,因为使用Map(...)只需几个字符就可以获得很多清晰度。 –