2012-12-04 1 views
8

Ho una classe con questo codice:Quali sono le garanzie per i qualificatori di accesso scala?

package shop.orders.services.email 

private[services] class EmailService {...} 

Poi in un pacchetto differente, io uso quella classe:

package shop.ui 

import shop.orders.services.email.EmailService 

class PaymentConfirmation extends WithFacesContext { 

    var emailService: EmailService = null 

Guardando il bytecode generato, non v'è alcun segno di modificatore di accesso, il che ha senso, poiché Java non supporta tali restrizioni di accesso. Quindi, cosa succede se creo una libreria che contiene il codice come il blocco uno e cerco di compilare il blocco due contro la libreria - non c'è alcuna possibilità che il compilatore fallisca, poiché l'informazione è persa. O è contenuto in qualcosa come un manifest?

Sto usando Scala 2.9.2.

risposta

10

È possibile fare riferimento a EmailService da Java, ma non da Scala, perché Scala memorizza la firma della classe come annotazione scala.reflect.ScalaSignature. Il compilatore Scala avrà esito negativo con il seguente errore:

class EmailService in package email cannot be accessed in package shop.orders.services.email

+0

Presumo che sia stato controllato solo in fase di compilazione e non in fase di esecuzione? –

+1

In fase di runtime, saresti soggetto solo al controllo del modificatore di accesso Java che in questo caso avrebbe sempre esito positivo, poiché la classe è pubblica secondo la JVM. – yakshaver