2012-06-04 17 views
5

Próbuję zbudować rozszerzenie dla sonaru, używając Scala. muszę przedłużyć następujący interfejs Java:Implementacja interfejsu Java z typem Raw z Scala

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

ale zasobów typ jest faktycznie zdefiniowany jak:

public abstract class Resource<PARENT extends Resource> 

wiem, że mogę obejść tworząc Java surowego super-klasę. Chciałbym pozostać przy Scala-only, wiem też, czy brakuje mi rozwiązania, i czy jest jakaś poprawa, którą mógłbym zasugerować ludziom SonarSource, którzy staną po ich stronie (przy użyciu surowych typów).

czytałem były problemy z tym, a niektóre obejścia niektórych przypadkach, ale żaden nie wydawał się tu zastosowania (a workaround, an apparently fixed ticket, również tam bilet 2091 ...)

+0

Jest to bardzo dobre pytanie! Próbowałem go odtwarzać i udało mi się uzyskać komunikaty o błędach, które wydają się niedokładne. 'Resource [_]' wygląda na to, że powinno działać, ale nie z jakiegoś powodu. – Owen

Odpowiedz

3

Po pewnym prób i błędów i patrząc na komunikaty o błędach, wymyśliłem ten który kompiluje:

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 
} 

Nie jestem pewien, czy będzie to pozwalają realizować to, czego potrzebujesz. Spojrzałem na Resource i mogłem reprezentować File, który rozciąga się na Resource<Directory> lub czasami jest wymazywany (raw?), Który po prostu rozszerza się ojak dla Directory.

Edit: myślenie o nim niektóre więcej, forSome można wyeliminować - to kompiluje też:

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

huynhjl, jesteś mężczyzną! Naprawdę myślałem, że nie było to możliwe. Myślę, że te rozwiązania dla scala-java interop powinny być udokumentowane gdzieś. – Roman

+0

@Roman, prawda, pamiętam potykając się o jeszcze prostszy problem próbując wdrożyć 'SolrRequestHandler'. Ciekaw jestem, gdzie próbowałeś spojrzeć na tego typu informacje, próbując rozwiązać swój problem? Mam pomysł, gdzie chciałbym dodać te informacje, ale nie zrobi to dobrze, jeśli nie jest to miejsce, gdzie ludzie szukają tego. – huynhjl

+0

Zrobiłem moje pierwsze wyszukiwanie tutaj. Na pewno dobrze byłoby mieć wpis ** Java/Scala interop ** na docs.scala-lang.org, nie sądzisz? – Roman

0

nie mam pojęcia o odpowiedzieć, ale jeśli piszę

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

pojawia się błąd

Co wydaje mi się błędne, ponieważ uważam, że rzeczywiste ograniczenia typu powinny być bardziej podobne do Resource[_ <: Resource[_ <: Resource[... ...]] (AnyRef nie będą odpowiednie jako górna granica).