2011-11-13 15 views
26

Ho una classe Java che ho portato su Scala, ma che ha ancora alcune sottoclassi Java che implementano funzionalità astratte.Posso creare un metodo con accesso protetto Java in Scala?

L'originale Java aveva

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

che è stato esteso

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

Ora, quando ho Base porta a Scala

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

Il compilatore si lamenta che

non può ridurre la visibilità del metodo ereditato ...


Ora capisco che perché le sue regole sono leggermente diverse, Scala tende a far rispettare la visibilità nel compilatore, piuttosto che il bytecode, in modo che sia getFoo segnalato pubblico nella classe javap'd. Ma

protected[packagename] def getFoo() 

ancora non genera un pukka (Java) metodo protetto, anche se penso che la visibilità dovrebbe essere lo stesso.

C'è un modo per convincere il compilatore di Scala ad emettere un metodo che Java considererà protetto?

+0

Accetterò un autorevole 'No' –

+0

Ottima domanda. Ho seguito lo stesso identico percorso prima di raggiungere questa pagina. – ebruchez

risposta

2

Se si riesce a sandwich Scala tra due implementazioni Java, è possibile creare una superclasse Java che solo ha desiderato metodi protetti astratti, almeno fino a quando si converte tutte le sottoclassi a Scala (se questo è in realtà il codice sotto la vostra controllo). Ma spero ci sia un modo migliore ...

EDIT: Un'altra opzione è quella di utilizzare una sorta di bytecode masterizzatore, come il annotation processing tool.

+3

È un piano spregevole, ma il migliore che ho visto! In realtà le sottoclassi sono sotto il mio controllo, quindi posso solo cambiare le implementazioni di getFoo in pubblico, ma questa sembra una domanda interessante. –

+0

@DuncanMcGregor: sì, lo so. Aggiunta un'altra opzione ... –