2011-08-23 5 views
13

In Java, è possibile creare interfacce pacchetto-privato. Guardandoli con javap, si vede che manca loro la visibilità "pubblica".Come si definisce un pacchetto-privato * tratto * in Scala?

In Scala, è possibile dichiarare un tratto come privato [pacchetto] o protetto [pacchetto], ma guardando in javap, è ancora pubblico.

Quindi, come si crea un tratto di pacchetto privato in Scala?

Mentre il compilatore Scala rispetta la visibilità, il mio problema è che la mia API sarà probabilmente accessibile anche da Java, e non voglio esporre la mia implementazione interna a Java.

risposta

10

Non è possibile creare modificatori privati ​​del pacchetto Java utilizzando Scala. Tuttavia è possibile combinare liberamente file Java e Scala in un progetto Scala. Quindi la soluzione più semplice è creare una classe/interfaccia Java e quindi estenderla in Scala.

+0

Mentre la risposta di John era più "educativa", hai fornito una soluzione, probabilmente l'unica. Poiché la maggior parte dei progetti Scala sono configurati per compilare anche Java, questo è ragionevole. –

13

Credo che questa è la risposta alla tua domanda

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

privato ha uno status speciale sottilmente nelle specifiche linguistiche sia Scala e Java. Controlla la discussione privata vs qualificata privata nella sezione Modificatori di SLS. In breve, privato è lo uguale a Java privato, mentre privato [foo] non è contrassegnato come privato in bytecode, ma implica semplicemente un controllo dell'accesso in fase di compilazione.

Non credo che si possa veramente rendere un pacchetto tratto privato una volta che è stato compilato in bytecode.

+0

Nel tuo link, lo stesso Martin Odersky dice: "In breve, privato è lo stesso di Java privato, mentre privato [foo] non è contrassegnato come privato nel bytecode, ma implica semplicemente un controllo dell'accesso in fase di compilazione." Che è ovviamente in contraddizione con le evidenze che vedo da javap, ma penso che stesse parlando di membri, costruttori in questo caso, piuttosto che di classi/tratti. –

+0

@Sebastien - abbastanza giusto. Non ho notato che tutte le interfacce vengono compilate nell'interfaccia pubblica. Indipendentemente da ciò, penso che la soluzione di Lex sia la migliore se vuoi che i tuoi tratti siano accessibili da Java. –