Подтвердить что ты не робот

Как ссылаться на защищенный внутренний класс в Scala при наследовании от Java (только с байтовым кодом)

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

У меня есть то же самое, что и в https://issues.scala-lang.org/browse/SI-3120, за исключением того, что у меня нет исходного кода Java, поэтому scalac знает только о зависимости от Java, просмотрев байт-код (в файлах jar или class).

Это в основном то, что я пытаюсь сделать:

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

У меня есть Java Sun JDK Hotspot 1.6.0_24 и Scala 2.9.0.1 на Linux. Вот что происходит:

$ 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

Примечание. Я знаю, что это звучит очень похоже на обычный "защищенный статический внутренний класс" проблема совместимости с Java в Scala, но я полагайте, что это не связано, потому что в моем примере нет статики.

Я чувствую, что что-то не так, потому что, когда я помещал тот же код в смешанный проект java/ scala в Eclipse, он, казалось, компилировался отлично (с последним синтаксисом JavaInnerClass); это только тогда, когда я компилирую код Scala только с байт-кодом Java (и без исходного кода Java), что я не могу заставить его работать. Я просто полностью не вижу правильного синтаксиса, чтобы ссылаться на внутренний класс Java, является ли это известным дефектом или мне нужно указать ошибку компилятора? Я не мог найти ничего об этом конкретном случае использования в моем поиске.

4b9b3361

Ответ 1

Это - отличная статья, в которой обсуждаются темы.

РЕДАКТИРОВАТЬ-1

Мой плохой, я быстро ответил. На самом деле это может быть ошибка Майка, я пытаюсь понять, могу ли я найти хак. Я дам вам знать, найду ли я его.

РЕДАКТИРОВАТЬ-2

Я пробовал разные вещи, но я не могу найти способ заставить его работать. Майк, я предлагаю вам подать отчет об ошибке.