2012-06-04 7 views
5

Estoy intentando construir una extensión para Sonar, usando Scala. I necesidad de ampliar la siguiente interfaz Java:Implementar la interfaz Java con tipo Raw desde Scala

public interface Decorator extends BatchExtension, CheckProject { 
    void decorate(Resource resource, DecoratorContext context); 
} 

pero Recursos tipo es en realidad define como:

public abstract class Resource<PARENT extends Resource> 

Sé que puedo solucionar creando una prima super-clase Java. Me gustaría ceñirme solo a Scala, también sé si hay una solución que me falta, y si hay una mejora que podría sugerirles a las personas de SonarSource que hagan de su lado (sobre el uso de tipos sin formato).

He leído que había problemas con este, y algunas soluciones para algunos casos, pero ninguno parece aplicarse aquí (a workaround, an apparently fixed ticket, también hay entradas ... 2091)

+0

Esta es una muy buena pregunta! Intenté jugar con él y pude obtener algunos mensajes de error que parecen imprecisos. 'Resource [_]' parece que debería funcionar, pero no por alguna razón. – Owen

Respuesta

3

Después de algún ensayo y error y mirando a los mensajes de error, se me ocurrió con este que compila:

import org.sonar.api.batch._ 
import org.sonar.api.resources._ 

object D { 
    type R = Resource[T] forSome {type T <: Resource[_ <: AnyRef]} 
    type S[T] = Resource[T] forSome {type T <: Resource[_ <: AnyRef]} 
} 

class D extends Decorator { 
    def decorate(r: D.R, context: DecoratorContext) {} 
    //def decorate(r: D.S[_], context: DecoratorContext) {} // compiles too 
    def shouldExecuteOnProject(project: Project) = true 
} 

No estoy seguro de si se le permitirá poner en práctica lo que necesita. Miré Resource, y podría representar File que se extiende Resource<Directory> o en ocasiones ser un tipo borrado (¿crudo?) Que simplemente se extiende Resource como para Directory.

Editar: pensar en ello un poco más, el forSome puede ser eliminado - esto compila también:

def decorate(resource: Resource[_ <: Resource[_ <: AnyRef]], 
      context: DecoratorContext) { 
} 
+0

huynhjl, eres el hombre! Realmente pensé que no había forma de evitar esto. Creo que estas soluciones para la interoperabilidad scala-java deberían estar documentadas en alguna parte. – Roman

+0

@Roman, es cierto, recuerdo haber tropezado con un problema aún más simple al intentar implementar 'SolrRequestHandler'. Tengo curiosidad, ¿dónde trataste de mirar este tipo de información mientras intentabas resolver tu problema? Tengo una idea en la que agregaría esta información, pero no funcionará si la gente no la busca. – huynhjl

+0

Hice mi primera búsqueda aquí. Seguro que sería bueno tener una entrada de ** Java/Scala interop ** en docs.scala-lang.org, ¿no crees? – Roman

0

que no tienen ni idea acerca de una respuesta, pero si escribo

def decorate(r: Resource[Resource[_]]) 

consigo un error

Lo que me parece incorrecto, porque creo que los límites del tipo real deberían ser más como Resource[_ <: Resource[_ <: Resource[... ...]] (AnyRef no sería apropiado como un límite superior).

Cuestiones relacionadas