Piszę klasę Scala, która dziedziczy z klasy Java, i muszę zastąpić metodę, która przyjmuje chronioną wewnętrzną klasę Javy jako parametr. Zależność Java występuje jako jar bez kodu źródłowego.Jak odnieść się do chronionej klasy wewnętrznej w Scali, gdy dziedziczy z Javy (tylko z kodem bajtu)
Mam dokładnie takie same ustawienia, jak w https://issues.scala-lang.org/browse/SI-3120, z tym że nie mam dostępnego kodu źródłowego Java, więc skalak wie tylko o zależnościach Java, patrząc na kod bajtowy (w plikach jar lub class).
To jest w zasadzie to, co usiłuję zrobić:
// 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")
}
}
Mam Sun Java JDK Hotspot 1.6.0_24 i Scala 2.9.0.1 w systemie Linux. To, co się dzieje:
$ 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
Uwaga, jeśli zmienię JavaSuperClass#JavaInnerClass
po prostu JavaInnerClass
, mam to:
ScalaSubClass.scala:6: error: method method overrides nothing
override def method(javaInnerClass: JavaInnerClass) {
^
one error found
Uwaga: Wiem, że to brzmi bardzo podobnie do wspólnej "protected static inner class" Java-compatibility issue in Scala, ale wierzę, że to nie ma związku, ponieważ w moim przykładzie nie ma żadnych statyki.
Czuję, że coś jest nie tak, ponieważ kiedy wstawiłem ten sam kod do mieszanego projektu java/scala w Eclipse, wydawało się, że kompiluje się dobrze (z ostatnią składnią JavaInnerClass
); dopiero wtedy, gdy skompiluję kod Scala tylko z kodem bajtowym Java (i bez kodu źródłowego Java), nie mogę go uruchomić. Czy po prostu brakuje mi poprawnej składni odnoszącej się do wewnętrznej klasy Java, czy jest to znana wada, czy powinienem zgłosić błąd kompilatora? Nie mogłem znaleźć nic na temat tego konkretnego przypadku użycia w moich poszukiwaniach.
Czy nie działa "JavaSuperClass.JavaInnerClass"? –
Nie, mówi "typ JavaInnerClass nie jest członkiem obiektu javapkg.JavaSuperClass" – Mike