2012-06-04 2 views
5

Я пытаюсь построить расширение для Sonar, используя Scala. мне нужно расширить следующий интерфейс Java:Внедрение интерфейса Java с использованием Raw типа из Scala

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

но ресурсов типа фактически определяется как:

public abstract class Resource<PARENT extends Resource> 

Я знаю, что я могу обойти создания Java-сырец супер-класса. Я хотел бы придерживаться только Scala, также знаю, есть ли решение, которое мне не хватает, и есть ли улучшения, которые я мог бы предложить людям SonarSource сделать на их стороне (используя необработанные типы).

Я прочитал там были проблемы с этим, и некоторые обходные пути для некоторых случаев, но никто, казалось, не применять здесь (a workaround, an apparently fixed ticket, также есть билет 2091 ...)

+0

Это очень хороший вопрос! Я попытался поиграть с ним и смог получить некоторые сообщения об ошибках, которые выглядят неточно. 'Resource [_]' похоже, что он должен работать, но это не по какой-то причине. – Owen

ответ

3

После нескольких проб и ошибок, и, глядя на сообщения об ошибках, я придумал это, которое составляет:

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 
} 

Я не уверен, будет ли это позволит вам осуществить то, что вам нужно. Я посмотрел на Resource, и он может представлять File, который расширяет Resource<Directory> или иногда является стираемым (необработанным?) Типом, который только расширяет Resource, как и для Directory.

Edit: думать об этом еще немного, то forSome можно устранить - это компилирует тоже:

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

huynhjl, ты мужчина! Я действительно думал, что вокруг этого не обойтись. Я думаю, что эти решения для scala-java interop должны быть документированы где-то. – Roman

+0

@Roman, правда, я помню, как споткнулся о еще более простой проблеме, пытаясь реализовать «SolrRequestHandler». Мне любопытно, где вы пытались посмотреть этот тип информации, пытаясь решить вашу проблему? У меня есть идея, когда я буду добавлять эту информацию, но это не принесет пользы, если это не то место, где люди ищут ее. – huynhjl

+0

Я сделал свой первый поиск здесь. Конечно, было бы неплохо иметь запись ** Java/Scala interop ** на docs.scala-lang.org, вам не кажется? – Roman

0

Я не имею ни малейшего представления о ответить, но если я пишу

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

Я получаю сообщение об ошибке

Это кажется неправильным для меня, потому что я думаю, что фактические границы типов должны быть больше похожими на Resource[_ <: Resource[_ <: Resource[... ...]] (AnyRef не подходит для верхней границы).