Я смотрю на код активатора безопасного типа, связанный с Akka, и меня заинтриговала следующая конструкция:
Сопутствующий объект:
object MarkerActor {
sealed trait MarkerMessage
case object Stop extends MarkerMessage
..
def objectMethod = print("hi from companion object")
}
Сопутствующий класс: он импортирует методы сопутствующего объекта:
class MarkerActor extends Actor with ActorLogging {
import MarkerActor._ // Comment this line to compare w or w/o import available
objectMethod // just to see if 'visible' within companion class
override def receive = {
case Stop => {
Так что ... это немного удивительно. Почему нет «особой связи» между сопутствующим классом / объектом, позволяющей классу «видеть» методы объекта автоматически?
Обновление Я был немного скептически настроен по этому поводу, поэтому пошел дальше и закомментировал "import MarkerActor._". Это привело к ошибкам "Symbol not found: Stop" в классе Companion. Итак .. импорт действительно необходим.
Stop
относится к типуStop.type
. В спецификации Scala говорится, что частные члены сопутствующего объекта видны в классе, но включает ли это типы? Если типы внутри сопутствующего объекта не видны в классе, вы не можете использоватьStop
, потому что его тип будет частным. - person Tobias Brandt   schedule 17.05.2014objectMethod
закрытым и по-прежнему вызывать его из класса. - person Tobias Brandt   schedule 17.05.2014