Pregunta Cómo hacer referencia a la clase interna protegida en Scala al heredar de Java (solo con código de bytes)


Estoy escribiendo una clase Scala para heredar de una clase Java, y debo anular 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.

Tengo la misma configuración exacta que encontré 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 sabe sobre la dependencia de Java mirando el código de bytes (en archivos jar o de clase).

Esto es básicamente lo que trato 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 Java Sun JDK Hotspot 1.6.0_24 y Scala 2.9.0.1 en Linux. Esto es lo que pasa:

$ 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, Entiendo esto:

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

Nota: Sé que esto suena muy similar al común "clase estática protegida" problema de compatibilidad Java en Scala, pero creo que esto 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 el último JavaInnerClass sintaxis); 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.


11
2018-06-25 08:58


origen


Respuestas:


Esta es un excelente artículo que discute el tema.

EDIT-1

Mi mal, respondí rápidamente. Esto en realidad puede ser un error Mike, estoy tratando de ver si puedo encontrar un truco. Te avisaré si encuentro uno.

EDIT-2

He intentado cosas diferentes, pero no puedo encontrar la manera de hacerlo funcionar. Mike, te sugiero que presentes un informe de error.


1
2018-06-25 09:25