Я пишу класс 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, является ли это известным дефектом или мне нужно указать ошибку компилятора? Я не мог найти ничего об этом конкретном случае использования в моем поиске.