2011-08-23 33 views
13

En Java, es posible crear interfaces de paquete privado. Mirándolos con javap, verá que carecen de la visibilidad "pública".¿Cómo se define un rasgo de paquete * privado * en Scala?

En Scala, puede declarar un rasgo como privado [paquete] o protegido [paquete], pero al mirar con javap, sigue siendo público.

Entonces, ¿cómo se crea un rasgo de paquete privado en Scala?

Si bien el compilador de Scala respeta la visibilidad, mi problema es que probablemente también accederá a mi API desde Java, y no quiero exponer mi implementación interna a Java.

Respuesta

10

No es posible crear modificadores privados del paquete Java utilizando Scala. Sin embargo, puede mezclar libremente archivos de Java y Scala en un proyecto de Scala. Entonces, la solución más fácil es crear una clase/interfaz Java y luego extenderla en Scala.

+0

Si bien la respuesta de John fue más "educativa", usted proporcionó una solución, probablemente la única. Como la mayoría de los proyectos de Scala están configurados para compilar también Java, esto es razonable. –

13

Creo que esta es la respuesta a su pregunta

http://www.scala-lang.org/node/10488

privado tiene un estatus especial en sutilmente las características lingüísticas de ambas Scala y Java. Consulte la discusión de privado vs privado en la sección Modificadores del SLS. En resumen, private es el igual que Java private, mientras que private [foo] no está marcado como privado en bytecode, sino que simplemente implica una verificación de acceso en tiempo de compilación.

No creo que realmente pueda hacer que un paquete de caracteres sea privado una vez que se haya compilado en bytecode.

+0

En su enlace, el propio Martin Odersky dice: "En resumen, privado es lo mismo que Java privado, mientras que privado [foo] no está marcado como privado en el bytecode, sino que simplemente implica un control de acceso en tiempo de compilación". Lo cual obviamente está en contradicción con las evidencias que veo de javap, pero creo que estaba hablando de miembros, constructores en este caso, en lugar de clases/rasgos. –

+0

@Sebastien - suficiente. No me di cuenta de que toda la interfaz se compila en la interfaz pública. En cualquier caso, creo que la solución de Lex es la mejor si quieres que tus rasgos sean accesibles desde Java. –

Cuestiones relacionadas