Класс Companion требует импорта методов объекта Companion и вложенных объектов?

Я смотрю на код активатора безопасного типа, связанный с 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. Итак .. импорт действительно необходим.


person WestCoastProjects    schedule 16.05.2014    source источник
comment
Я думаю, что он действительно импортирует типы.   -  person Tobias Brandt    schedule 17.05.2014
comment
Нет, я закомментировал оператор импорта, а затем объекты дела были помечены как Невозможно разрешить символ Стоп   -  person WestCoastProjects    schedule 17.05.2014
comment
Stop относится к типу Stop.type. В спецификации Scala говорится, что частные члены сопутствующего объекта видны в классе, но включает ли это типы? Если типы внутри сопутствующего объекта не видны в классе, вы не можете использовать Stop, потому что его тип будет частным.   -  person Tobias Brandt    schedule 17.05.2014
comment
К ним относятся типы, да. В любом случае я также показал метод objectMethod, который отображает такое же поведение видимости (/ невидимости).   -  person WestCoastProjects    schedule 17.05.2014
comment
Интересно. По-видимому, наличие метода в сопутствующем объекте означает, что вы можете получить к нему доступ, но он не импортируется автоматически. Вы должны иметь возможность сделать objectMethod закрытым и по-прежнему вызывать его из класса.   -  person Tobias Brandt    schedule 17.05.2014
comment
Правильно - приват не скрывает метод компаньона от класса.   -  person WestCoastProjects    schedule 17.05.2014
comment
Итак, вот ваш ответ: класс и объект имеют особые отношения, они могут получить доступ к своим соответствующим частям. Однако им по-прежнему необходимо уточнять доступ с помощью имени класса / объекта.   -  person Tobias Brandt    schedule 17.05.2014
comment
Я собираюсь оставить этот вопрос открытым, чтобы услышать, есть ли что-то еще о деталях отношений, чтобы потенциально получить больше информации здесь. Но в любом случае я продолжу и проголосую за ваш последний комментарий.   -  person WestCoastProjects    schedule 17.05.2014
comment
Ответ Тобиаса правильный. Перейдите по ссылкам в этой ветке, чтобы узнать, почему это так, несколько лет назад. scala-lang.org/old/node/2411   -  person Chris    schedule 17.05.2014
comment
Это Виктор Кланг задает этот вопрос, так что я в хорошей компании!   -  person WestCoastProjects    schedule 17.05.2014
comment
Итак, резюмируя цепочку из ссылки от @Chris: она обсуждалась на самом высоком уровне (включая Одерского), и (далеко не единодушное) согласие было то, что автоматический импорт сопутствующих артефактов в класс не был предпочтительным. Это было раздельное решение.   -  person WestCoastProjects    schedule 17.05.2014
comment
@Chris Я хотел бы принять в качестве ответа ваш пост - поскольку он лежит в основе решения - который был вынесен раздельным решением.   -  person WestCoastProjects    schedule 19.05.2014
comment
Я просто преобразовал это в ответ для вас.   -  person Chris    schedule 19.05.2014


Ответы (1)


Несколько лет назад обсуждалось, следует ли неявно импортировать все члены сопутствующих объектов в их родительские классы. В то время было принято решение, которое имеет смысл и сегодня: потребовать явного импорта, поскольку легче добавить дополнительный импорт, чем удалить нежелательный. Вот полное обсуждение.

person Chris    schedule 18.05.2014
comment
ссылка nabble в обсуждении scala-lang.org не сработала для меня вот альтернативная ссылка scala-language.1934581.n4.nabble.com/ - person Jean; 17.06.2015