2011-12-21 2 views
15

В Scala 2.9.1 я получаю следующее поведение:Scala: порядок определения для объекта-компаньона против случая класса

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, если они находятся в определении функции. Является ли это ошибкой компилятора или преднамеренным? Если последнее, почему?

ответ

12

Это известная ошибка: SI-3772: companions and method-owned case classes. Это частично исправлено, но проблема OP все еще остается. Проголосуйте, если хотите, чтобы оно было исправлено.

+0

Это довольно легко обойти, так что я не уверен, что стоит проголосовать. Спасибо за ссылку на билет. –

1

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

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

+0

Подождите, что? :-) Вы имели в виду, что «классы и объекты могут иметь форвардные определения, но ** методы ** не могут»? –

+1

@GregorScheidt Ни методы, ни функции. Ну, Scala Spec не знает, что такое «метод», поэтому я мог бы также назвать их функциями, но я ненавижу путаницу имени вокруг «функции». –

Смежные вопросы