从Scala实现具有Raw类型的Java接口

Rom*_*man 6 java generics scala scala-java-interop sonarqube

我正在尝试使用Scala为Sonar构建扩展.我需要扩展以下Java接口:

public interface Decorator extends BatchExtension, CheckProject {
    void decorate(Resource resource, DecoratorContext context);
}
Run Code Online (Sandbox Code Playgroud)

资源类型实际上定义如下:

public abstract class Resource<PARENT extends Resource>
Run Code Online (Sandbox Code Playgroud)

我知道我可以解决创建Java原始超类的问题.我想坚持只使用Scala,也知道是否有一个我缺少的解决方案,以及是否有一个改进我可以建议SonarSource人员在他们身边(使用原始类型).

我已经阅读过这方面存在的问题,以及某些情况下的一些解决方法,但似乎没有适用于此处(一种解决方法,一张明显固定的机票,还有2091号机票...)

huy*_*hjl 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
}
Run Code Online (Sandbox Code Playgroud)

我不确定它是否能让您实现您所需要的。我查看了Resource,它可以代表File哪个扩展,或者有时是一个像 for 一样Resource<Directory>扩展的擦除(原始?)类型。ResourceDirectory

编辑:再考虑一下,forSome可以消除 - 这也可以编译:

def decorate(resource: Resource[_ <: Resource[_ <: AnyRef]],
             context: DecoratorContext) {
}
Run Code Online (Sandbox Code Playgroud)