Scala: порядок определения сопутствующего объекта и класса case

В Scala 2.9.1 я получаю следующее поведение:

class Foo {
   case class X()
   object X            // this compiles

   def bar() {
      object Y         // this compiles
      case class Y()

      case class Z()
      object Z         // won't compile (see below)
   }
}

Компилятор жалуется на Object Z: error: Z уже определен как (сгенерированный компилятором) объект-компаньон Z класса case

Похоже, что определение сопутствующего объекта для класса case после определения класса case недопустимо, если они находятся в определении функции. Это ошибка компилятора или преднамеренная? Если второе, то почему?


person Gregor Scheidt    schedule 21.12.2011    source источник


Ответы (2)


Это известная ошибка: SI-3772: компаньоны и классы дел, принадлежащие методам. Это частично исправлено, но проблема с OP все еще остается. Проголосуйте за это, если хотите, чтобы это было исправлено.

person Matthew Farwell    schedule 21.12.2011
comment
Это довольно легко обойти, поэтому я не уверен, что стоит голосовать. Спасибо за ссылку на билет. - person Gregor Scheidt; 21.12.2011

Причина, по которой первое разрешено, а второе - нет, заключается в том, что классы и объекты могут иметь прямые определения, а определения - нет. Итак, почему компилятор может смешивать object X с определенным классом case, это невозможно сделать во втором случае.

Интересно, что происходит в случае Y: затенение или объект-компаньон вообще не создается?

person Daniel C. Sobral    schedule 21.12.2011
comment
Чего ждать? :-) Вы имели в виду, что классы и объекты могут иметь прямые определения, а методы - нет? - person Gregor Scheidt; 21.12.2011
comment
@GregorScheidt Ни методов, ни функций. Что ж, Scala Spec не знает, что такое метод, поэтому я могу называть их функциями, но я ненавижу путаницу в именах вокруг функции. - person Daniel C. Sobral; 21.12.2011