2012-06-04 10 views
5

Sto provando a creare un'estensione per Sonar, utilizzando Scala. Ho bisogno di estendere la seguente interfaccia Java:Implementare l'interfaccia Java con tipo Raw da Scala

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

ma Resource tipo è in realtà definita come:

public abstract class Resource<PARENT extends Resource> 

so di poter aggirare la creazione di una Java prime super-class. Mi piacerebbe attenermi solo a Scala, anche sapere se c'è una soluzione che mi manca e se c'è un miglioramento che potrei suggerire a persone di SonarSource di fare dalla loro parte (usando i tipi grezzi).

che ho letto ci sono stati problemi con questo, e alcune soluzioni per alcuni casi, ma nessuno sembrava di applicare qui (a workaround, an apparently fixed ticket, anche non c'è biglietto di 2091 ...)

+0

Questa è una bella domanda! Ho provato a giocarci e sono riuscito a ottenere alcuni messaggi di errore che appaiono imprecisi. 'Risorsa [_]' sembra che dovrebbe funzionare, ma non per qualche motivo. – Owen

risposta

3

Dopo alcuni tentativi ed errori e guardando i messaggi di errore, sono arrivato fino a questo che 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 
} 

Io non sono sicuro se vi permetterà di implementare quello che ti serve. Ho guardato a Resource e potrebbe rappresentare File che si estende a Resource<Directory> oa volte è un tipo cancellato (crudo?) Che si estende appena Resource come per Directory.

Edit: pensarci ancora un po ', il forSome può essere eliminato - questo compila anche:

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

huynhjl, tu sei l'uomo! Ho davvero pensato che non c'era modo di aggirare questo. Penso che queste soluzioni per l'interoperabilità scala-java dovrebbero essere documentate da qualche parte. – Roman

+0

@Roman, vero, ricordo che mi sono imbattuto in un problema ancora più semplice cercando di implementare 'SolrRequestHandler'. Sono curioso, dove hai provato a guardare questo tipo di informazioni mentre cercavi di risolvere il tuo problema? Ho la mia idea di dove aggiungerei queste informazioni, ma non andrà bene se non è dove le persone vanno a cercarlo. – huynhjl

+0

Ho fatto la mia prima ricerca qui. Sicuramente sarebbe bello avere una voce ** di Java/Scala interop ** su docs.scala-lang.org, non credi? – Roman

0

ho idea circa rispondo, ma se scrivo

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

ottengo un errore

Quale mi sembra sbagliato, perché penserei che i limiti effettivi del tipo dovrebbero essere più simili a Resource[_ <: Resource[_ <: Resource[... ...]] (AnyRef non sarebbe appropriato come limite superiore).