【问题标题】:Implement Java Interface with Raw type from Scala使用 Scala 的 Raw 类型实现 Java 接口
【发布时间】:2012-06-08 03:52:51
【问题描述】:

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

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

Resource 类型实际上是这样定义的:

public abstract class Resource<PARENT extends Resource>

我知道我可以解决创建 Java 原始超类的问题。 我想坚持仅使用 Scala,也知道是否有我遗漏的解决方案,以及我是否可以建议 SonarSource 人员在他们身边做出改进(使用原始类型)。

我已经读过这方面存在问题,并且在某些情况下有一些解决方法,但似乎都不适用于这里(a workaroundan apparently fixed ticket,还有票 2091...)

【问题讨论】:

  • 这是一个非常好的问题!我尝试使用它,并且能够得到一些看起来不准确的错误消息。 Resource[_] 似乎应该可以工作,但由于某种原因它没有。

标签: java scala generics sonarqube scala-java-interop


【解决方案1】:

我不知道答案,但如果我写

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

我收到一个错误

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

这对我来说似乎是错误的,因为我认为实际的类型边界应该更像 Resource[_ &lt;: Resource[_ &lt;: Resource[... ...]]AnyRef 不适合作为上限)。

【讨论】:

    【解决方案2】:

    经过一些试验和错误并查看错误消息,我想出了这个编译:

    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&lt;Directory&gt;,或者有时是一个擦除(原始?)类型,它只是扩展了Resource,就像Directory一样。

    编辑:再想一想,forSome 可以被消除 - 这也可以编译:

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

    【讨论】:

    • huynhjl,你就是那个男人!我真的认为没有办法解决这个问题。我认为 scala-java 互操作的这些解决方案应该记录在某个地方。
    • @Roman,真的,我记得在尝试实现SolrRequestHandler 时遇到了一个更简单的问题。我很好奇,您在尝试解决问题时在哪里尝试查看此类信息?我知道我应该在哪里添加这些信息,但如果这不是人们去寻找它的地方,那就没有用了。
    • 我在这里进行了第一次搜索。当然,在 docs.scala-lang.org 上有一个 Java/Scala interop 条目会很好,你不觉得吗?
    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2012-10-06
    相关资源
    最近更新 更多