Scala: порядок определения для объекта-компаньона vs case class

В 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:   ошибка: Z уже определен как (сгенерированный компилятором) объект класса класса класса Z

Похоже, что недопустимо определять объект-компаньон для класса case после определения класса case, если они находятся в определении функции. Является ли это ошибкой компилятора или преднамеренным? Если последнее, почему?

Ответы

Ответ 2

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

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