2011-11-13 13 views
26

Tengo una clase de Java que he transferido a Scala, pero que todavía tiene algunas subclases de Java que implementan la funcionalidad abstracta.¿Puedo crear un método con acceso protegido de Java en Scala?

El Java original tenía

public abstract class Base { 
    ... 
    protected abstract Foo getFoo(); 
} 

que se extendió

public class Fred extends Base { 
    ... 
    protected Foo getFoo() { 
     return foo; 
    } 
} 

Ahora, cuando el puerto base de Scala

class Base { 
    ... 
    protected def getFoo(): Foo 
} 

El compilador se queja de que

no pueden reducir la visibilidad del método heredado ...


Ahora entiendo que debido a sus reglas son sutilmente diferentes, Scala tiende a reforzar la visibilidad en el compilador en vez del código de bytes, por lo que es getFoo marcado público en la clase javap'd. Pero

protected[packagename] def getFoo() 

todavía no genera un pukka (Java) método protegido, aunque creo que la visibilidad debe ser el mismo.

¿Hay alguna manera de persuadir al compilador de Scala de que emita un método que Java considerará protegido?

+0

Acepto un 'No' autorizado –

+0

Excelente pregunta. Seguí exactamente el mismo camino antes de llegar a esta página. – ebruchez

Respuesta

2

Si puede Scala sándwich entre dos implementaciones de Java, puede crear una superclase de Java que única tiene los métodos protegidos abstractos desea, al menos hasta que convierta todas las subclases de Scala (si esto es realmente código bajo su controlar). Pero espero que haya una mejor manera ...

EDIT: Otra opción es usar algún tipo de reescritura de códigos de bytes, como el annotation processing tool.

+3

Es un plan despreciable, ¡pero el mejor que he visto! En realidad, las subclases están bajo mi control, así que puedo simplemente cambiar las implementaciones de getFoo a público, pero esta parecía una pregunta interesante. –

+0

@DuncanMcGregor: sí, lo sé. Agregó otra opción ... –

Cuestiones relacionadas