Вопрос по generics, java, sonarqube, scala-java-interop, scala – Реализовать Java-интерфейс с типом Raw из Scala

6

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

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

ноResource тип на самом деле определяется как:

public abstract class Resource<PARENT extends Resource>

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

Я читал, что были проблемы с этим, и некоторые обходные пути для некоторых случаев, но ни одна из них здесь не применима (обходной путь, очевидно фиксированный билетТакже есть билет 2091 ...)

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

Ваш Ответ

2   ответа
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 не подходит в качестве верхней границы).

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
}

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

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

def decorate(resource: Resource[_ <: Resource[_ <: AnyRef]],
             context: DecoratorContext) {
}
huynhjl, ты человек! Я действительно думал, что не было никакого способа обойти это. Я думаю, что эти решения для взаимодействия Scala-Java должны быть где-то задокументированы. Roman
Я сделал мой первый поиск здесь. Наверняка было бы неплохо иметьJava/Scala interop запись на docs.scala-lang.org, вы не думаете? Roman
@Roman, правда, я помню, что наткнулся на еще более простую проблему, пытаясь реализоватьSolrRequestHandler, Мне любопытно, где вы пытались посмотреть на этот тип информации, пытаясь решить вашу проблему? У меня есть идея, где бы я мог добавить эту информацию, но она не принесет пользы, если это не то место, куда люди обращаются за ней.

Похожие вопросы