从Java继承时如何在Scala中引用受保护的内部类(仅限字节代码)

Mik*_*ike 11 scala

我正在编写一个Scala类来继承Java类,我必须覆盖一个将受保护的Java内部类作为参数的方法.Java依赖是一个没有源代码的jar.

我有与https://issues.scala-lang.org/browse/SI-3120中完全相同的设置,除了我没有可用的Java源代码,因此scalac只通过查看它来了解Java依赖关系字节代码(在jar或类文件中).

这基本上就是我要做的事情:

// javapkg/JavaSuperClass.java
package javapkg;
public class JavaSuperClass {
    protected class JavaInnerClass {
    }
    public void method(JavaInnerClass javaInnerclass) {
        System.out.println("hello");
    }
}

// scalapkg/ScalaSubClass.scala
package scalapkg
import javapkg.JavaSuperClass
class ScalaSubClass extends JavaSuperClass {
  override def method(javaInnerClass: JavaSuperClass#JavaInnerClass) {
    println("world")
  }
}
Run Code Online (Sandbox Code Playgroud)

我在Linux上有Java Sun JDK Hotspot 1.6.0_24和Scala 2.9.0.1.这是发生的事情:

$ cd javapkg
$ javac JavaSuperClass.java
$ cd ../scalapkg
$ scalac -cp .. ScalaSubClass.scala
ScalaSubClass.scala:6: error: class JavaInnerClass in class JavaSuperClass cannot be accessed in javapkg.JavaSuperClass
 Access to protected class JavaInnerClass not permitted because
 prefix type javapkg.JavaSuperClass does not conform to
 class ScalaSubClass in package scalapkg where the access take place
  override def method(javaInnerclass: JavaSuperClass#JavaInnerClass) {
                                                     ^
one error found
Run Code Online (Sandbox Code Playgroud)

请注意,如果我JavaSuperClass#JavaInnerClass改为简单JavaInnerClass,我会得到:

ScalaSubClass.scala:6: error: method method overrides nothing
  override def method(javaInnerClass: JavaInnerClass) {
               ^
one error found
Run Code Online (Sandbox Code Playgroud)

注意:我知道这听起来非常类似于Scala中常见的"受保护的静态内部类"Java兼容性问题,但我认为这是无关的,因为在我的示例中没有任何静态.

我觉得有些不对劲,因为当我将相同的代码放入Eclipse中的混合java/scala项目时,它似乎编译得很好(使用后一种JavaInnerClass语法); 只有当我用只有Java字节代码(而且没有Java源代码)编译Scala代码时才能让它工作.我只是完全错过了引用Java内部类的正确语法,这是一个已知缺陷,还是应该提交编译器错误?我在搜索中找不到关于这个确切用例的任何内容.

Mir*_*tta 1

是一篇讨论该主题的优秀文章。

编辑-1

我的错,我很快就回答了。这实际上可能是一个错误,迈克,我正在尝试看看是否可以找到解决办法。如果我找到了,我会告诉你的。

编辑2

我尝试过不同的方法,但找不到让它发挥作用的方法。迈克,我建议您提交错误报告。