6

Scala を使用して、Sonar の拡張機能を構築しようとしています。次の Java インターフェイスを拡張する必要があります。

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

しかし、リソースタイプは実際には次のように定義されています:

public abstract class Resource<PARENT extends Resource>

Java raw スーパークラスを作成することで回避できることはわかっています。私はScalaのみに固執したいと思います。また、私が見逃している解決策があるかどうか、およびSonarSourceの人々に提案できる改善があるかどうかも知りたいです(生の型を使用して)。

これには問題があり、場合によってはいくつかの回避策があることを読みましたが、ここには適用されないようです(回避策明らかに修正されたチケット、チケット2091もあります...)

4

2 に答える 2

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を調べたところ、 for のようにFile拡張Resource<Directory>するだけの、または場合によっては消去された (生の?) 型を表すことができます。ResourceDirectory

編集:もう少し考えてみると、forSome削除できます-これもコンパイルされます:

def decorate(resource: Resource[_ <: Resource[_ <: AnyRef]],
             context: DecoratorContext) {
}
于 2012-06-04T14:51:14.320 に答える
0

答えはわかりませんが、私が書くなら

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

エラーが発生する

type arguments [Resource[_]] do not conform to class Resource's type parameter bounds [PARENT <: Resource[_ <: AnyRef]]

Resource[_ <: Resource[_ <: Resource[... ...]]実際の型の境界は(AnyRef上限として適切ではない) のようにする必要があると思うので、これは私には間違っているようです。

于 2012-06-04T03:13:28.313 に答える