Error de tipo Scala con rasgos y genéricos

Recientemente volví a Scala después de un largo paréntesis en Python e intenté volver a pensar en el sistema de tipos. Estoy tratando de hacer un despachador de URL web muy simple para volver a familiarizarme con el idioma. Hasta ahora tengo:

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

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

Lo que creo que tengo aquí es el equivalente en Scala de un ejecutable de interfaz y una clase que implementa esa interfaz. Ahora me gustaría crear una asignación de direcciones URL a los controladores de esta manera:

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

Cuando compilo esto, aparece el siguiente error:

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

No estoy seguro de dónde me equivoqué en mi comprensión aquí, pero agradecería cualquier ayuda para comprender cómo puedo poner un montón de clases diferentes que tienen el rasgo de Ejecutable en un objeto de mapa.

TIA

preguntado el 12 de junio de 12 a las 20:06

2 Respuestas

Scala no tiene un mapa literal como ese. Sin embargo, lo siguiente debería funcionar:

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

Esto es solo usar el Map objeto's apply método para crear un nuevo mapa.

Respondido el 12 de junio de 12 a las 20:06

Puede crear un mapa a partir de una secuencia genérica de Tuples2, pero no hay una conversión automática de Tuple2 a mapa. Eso tiene mucho sentido: ¿por qué crearía un mapa con una sola clave y un solo valor?

Respondido el 12 de junio de 12 a las 23:06

Creo mapas con un solo par clave-valor todo el tiempo (no realmente, supongo, pero lo he hecho antes, y no es algo completamente irrazonable). Es más probable que no haya una conversión implícita porque al usar Map(...) compra mucha claridad por solo unos pocos caracteres. - Travis Brown

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.