【问题标题】:Scala Type Error with Traits and Generics具有特征和泛型的 Scala 类型错误
【发布时间】:2012-06-12 19:01:18
【问题描述】:

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    Scala 没有这样的地图文字。不过,以下应该可以工作:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我一直使用单个键值对创建地图(我猜不是真的,但我以前有过,这并不是一件完全不合理的事情)。更有可能没有隐式转换,因为使用 Map(...) 可以为几个字符带来很多清晰度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 2020-03-27
      相关资源
      最近更新 更多