2011-12-21 15 views
15

In Scala 2.9.1 ottengo il seguente comportamento:Scala: ordine di definizione per oggetto associato vs classe caso

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) 
    } 
} 

Il compilatore si lamenta per Object Z: errore: Z è già definito come (generato dal compilatore) Oggetto compagno della classe case Z

Sembra che non sia consentito definire un oggetto companion per una classe case dopo la definizione della classe case se si trova all'interno di una definizione di funzione. È un bug del compilatore o intenzionale? Se quest'ultimo, perché?

risposta

12

Questo è un bug noto: SI-3772: companions and method-owned case classes. Questo è parzialmente riparato, ma il problema dell'OP rimane ancora. Votalo se lo vuoi aggiustato

+0

È abbastanza facile da aggirare, quindi non sono sicuro che valga la pena di votare. Grazie per il link al biglietto. –

1

Il motivo per cui il primo è consentito e il secondo no è che le classi e gli oggetti possono avere definizioni in avanti, ma le definizioni non possono. Quindi, perché è possibile che il compilatore mischi object X con quello definito dalla classe case, non è possibile farlo nel secondo caso.

Mi chiedo cosa succede nel caso Y: lo shadowing o l'oggetto companion non viene generato affatto?

+0

Aspetta, cosa? :-) Volevi dire "classi e oggetti possono avere definizioni in avanti, ma ** metodi ** non possono"? –

+1

@GregorScheidt Né i metodi né le funzioni. Beh, Scala Spec non sa cosa sia un "metodo", quindi potrei chiamarli anche funzioni, ma odio il nome confusione attorno alla "funzione". –

Problemi correlati