dhable
dhable

Reputation: 2879

Scala Type Error with Traits and Generics

I've recently returned to scala after a long hiatus in python and trying to wrap my mind around the type system again. I'm trying to make a very simple web URL dispatcher to get familiar with the language again. So far I have:

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

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

What I think I have here is the scala equivalent of an interface Executable and a class that implements that interface. Now I'd like to create a mapping of URLs to handlers like so:

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

When I compile this, I get the following error:

type mismatch;
   found   : (java.lang.String, pollcaster.handlers.HelloWorldHandler)
   required: Map[String,pollcaster.Executable]
           "/" -> new HelloWorldHandler()
                  ^

I'm not sure where I went wrong in my understanding here but would appreciate any help in understanding how can I put a bunch of different classes that have the trait of Executable into a map object?

TIA

Upvotes: 1

Views: 194

Answers (2)

Edmondo
Edmondo

Reputation: 20080

You can create a Map from a generic Seq of Tuples2 but there is no automatic conversion from Tuple2 to Map. That makes perfectly sense: why would you create a map with a single key and a single value?

Upvotes: 0

Travis Brown
Travis Brown

Reputation: 139038

Scala doesn't have a map literal like that. The following should work, though:

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

This is just using the Map object's apply method to create a new map.

Upvotes: 4

Related Questions