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号机票...)
经过一番尝试和错误并查看错误消息后,我想出了这个编译结果:
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)