Каковы гарантии квалификаторов доступа scala?

У меня есть класс с этим кодом:

package shop.orders.services.email

private[services] class EmailService {...}

Затем в другом пакете я использую этот класс:

package shop.ui

import shop.orders.services.email.EmailService

class PaymentConfirmation extends WithFacesContext {

    var emailService: EmailService = null

Глядя на сгенерированный байт-код, не видно никаких признаков модификатора доступа, что имеет смысл, поскольку Java не поддерживает такие ограничения доступа. Итак, что произойдет, если я создам библиотеку, содержащую код, подобный первому блоку, и попытаюсь скомпилировать второй блок с библиотекой - нет никаких шансов, что компилятор выйдет из строя, поскольку информация будет потеряна. Или он содержится в чем-то вроде манифеста?

Я использую Скала 2.9.2.


person John Smith    schedule 04.12.2012    source источник


Ответы (1)


Вы можете ссылаться на EmailService из Java, но не из Scala, потому что Scala хранит подпись класса как аннотацию scala.reflect.ScalaSignature. Компилятор Scala завершится со следующей ошибкой:

класс EmailService в электронной почте пакета недоступен в пакете shop.orders.services.email

person yakshaver    schedule 04.12.2012
comment
Я предполагаю, что это проверяется только во время компиляции, а не во время выполнения? - person John Smith; 05.12.2012
comment
Во время выполнения вы будете подвергаться только проверке модификатора доступа Java, которая в этом случае всегда будет успешной, поскольку класс является общедоступным в соответствии с JVM. - person yakshaver; 05.12.2012