2012-06-12 56 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(...)只需幾個字符就可以獲得很多清晰度。 –