scala - 从Java继承时如何在Scala中引用 protected 内部类(仅限字节码)

标签 scala

我正在编写一个从 Java 类继承的 Scala 类,并且我必须重写一个采用 protected Java 内部类作为参数的方法。 Java 依赖项以 jar 形式提供,没有源代码。

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

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

// 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")
  }
}

我在 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

请注意,如果我将 JavaSuperClass#JavaInnerClass 更改为简单的 JavaInnerClass,我会得到以下结果:

ScalaSubClass.scala:6: error: method method overrides nothing
  override def method(javaInnerClass: JavaInnerClass) {
               ^
one error found

注意:我知道这听起来与常见的 "protected static inner class" Java-compatibility issue in Scala 非常相似。 ,但我相信这是不相关的,因为我的示例中没有任何静态数据。

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

最佳答案

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

EDIT-1

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

EDIT-2

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

关于scala - 从Java继承时如何在Scala中引用 protected 内部类(仅限字节码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6476848/

相关文章:

scala - 为什么 paramGridBuilder 与 CountVectorizer 发生 scala 错误?

java - Scala 中带有字符串和字符参数的 Split 之间的区别?

java - 使用 querulous "java.lang.NoClassDefFoundError: com/twitter/conversions/time"时出现问题

scala - Scala 中 `def` 和 `val` 的不同类型推断

scala - 批处理和函数式编程

scala - 部署没有依赖项的 Scala 二进制文件

scala - 使用 Chisel3 的两个信号 4 位之间的内积(点积。)

scala - 获取两个列表的元素总和的最快方法

scala - 在 Scala 中转换所有数据框列的有效方法

scala - 如何在使用 2.10.1 构建的项目中使用使用 2.9.2 构建的库?