2011-08-31 22 views
7

Estoy desarrollando un servicio web REST en Scala utilizando la implementación de referencia JAX-RS Jersey y me aparece un error extraño.Problema de tipo Scala (inferencia)?

Estoy tratando de crear un objeto ContentDisposition usando el ContentDisposition.ContentDispositionBuilder.

tiene T extends ContentDisposition.ContentDispositionBuilder y V extends ContentDisposition. El método type de ContentDisposition devuelve una instancia del generador.

el código

val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).build() 

obras embargo

val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).fileName("dummy").build() 

produce el error del compilador

error: value build is not a member of ?0 
val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).fileName("dummy").build() 
                             ^

(Tenga en cuenta que type necesita ser puesto en "comillas" porque es una palabra clave en Scala)

fileName de ContentDispositionBuilder devuelve una instancia de T por lo que esto realmente debería funcionar.

No entiendo esto. ¿Alguna idea? Estoy usando Scala 2.9.0.1 por cierto.

Actualización:

Esto funciona. Pero, ¿por qué necesito el casting aquí?

val contentDisposition = ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM) 
    .fileName("dummy") 
    .asInstanceOf[ContentDisposition.ContentDispositionBuilder[_,_]] 
    .build() 
+0

¿Soy yo o ninguno de sus enlaces parecen funcionar? – agilesteel

+0

Parece que java.net está caído en este momento :-( –

+1

El error tiene algo que ver con la interpolación entre los comodines de Java y los existenciales de Scala. Aunque similares, estas dos características del sistema de tipo no son las mismas. Esta es una toma en la oscuridad , pero podría valer la pena intentarlo con el recién publicado Scala 2.9.1. –

Respuesta

2

Creo que la inferencia de tipo solo puede llegar tan lejos ... Probablemente puede hacerlo en dos líneas, sin tener que hacer ningún molde; ¿Has probado esto?

val something=ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM) 
val contentDisposition=something.fileName("dummy").build() 

o tal vez

val builder=ContentDisposition.`type`(MediaType.APPLICATION_OCTET_STREAM).fileName("dummy") 
val contentDisposition=builder.build() 
Cuestiones relacionadas