2011-06-25 6 views
11

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.

+0

¿No funciona 'JavaSuperClass.JavaInnerClass'? –

+0

No, dice "tipo JavaInnerClass no es miembro del objeto javapkg.JavaSuperClass" – Mike

Respuesta

1

This es un excelente artículo sobre el tema.

EDITAR-1

Mi mal, me respondió de forma rápida. Esto en realidad puede ser un error Mike, estoy tratando de ver si puedo encontrar un truco. Te avisaré si encuentro uno.

EDITAR-2

He intentado cosas diferentes, pero no puedo encontrar una manera de hacer que funcione. Mike, te sugiero que presentes un informe de error.

+1

Gracias por intentar que funcione y confirmar que no soy solo yo. He archivado un error aquí: https://issues.scala-lang.org/browse/SI-4737 – Mike

+0

No hay problema, Mike. Veamos qué piensan los gigantes;) –

Cuestiones relacionadas