Estoy escribiendo una clase Scala para heredar de una clase Java, y debo reemplazar un método que toma una clase interna Java protegida como parámetro. La dependencia de Java viene como un contenedor sin código fuente.Cómo hacer referencia a la clase interna protegida en Scala cuando se hereda de Java (solo con código de bytes)
Tengo exactamente la misma configuración que la encontrada en https://issues.scala-lang.org/browse/SI-3120 excepto que no tengo el código fuente de Java disponible, por lo que scalac solo conoce la dependencia de Java mirando el código de bytes (en jar o class).
Esto es básicamente lo que estoy tratando de hacer:
// 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")
}
}
tengo Sun Java JDK 1.6.0_24 y hotspot Scala 2.9.0.1 en Linux. Esto es lo que sucede:
$ 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
Nota, si cambio JavaSuperClass#JavaInnerClass
simplemente JavaInnerClass
, me sale esto:
ScalaSubClass.scala:6: error: method method overrides nothing
override def method(javaInnerClass: JavaInnerClass) {
^
one error found
Nota: Sé que esto suena muy similar a la común "protected static inner class" Java-compatibility issue in Scala, pero creo que esta no está relacionado porque no hay estática en ninguna parte de mi ejemplo.
Siento que algo anda mal, porque cuando puse el mismo código en un proyecto mixto java/scala en Eclipse, parecía compilar bien (con la última sintaxis JavaInnerClass
); Solo cuando compilo el código de Scala con solo el código de bytes de Java (y ningún código fuente de Java) no puedo hacerlo funcionar. ¿Me falta completamente la sintaxis correcta para referirme a una clase interna de Java, es este un defecto conocido, o debería archivar un error de compilación? No pude encontrar nada sobre este caso de uso exacto en mi búsqueda.
¿No funciona 'JavaSuperClass.JavaInnerClass'? –
No, dice "tipo JavaInnerClass no es miembro del objeto javapkg.JavaSuperClass" – Mike