2011-12-21 10 views
15

En Scala 2.9.1 me sale el siguiente comportamiento:Scala: orden de la definición de objeto acompañante vs clase 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) 
    } 
} 

El compilador se queja de Object Z: error: Z ya se define como generado por el compilador () objeto complementario de clase de caso Z

Parece que no está permitido definir un objeto complementario para una clase de caso después de la definición de clase de caso si están dentro de una definición de función. ¿Es esto un error del compilador o intencional? Si esto último, ¿por qué?

Respuesta

12

Este es un error conocido: SI-3772: companions and method-owned case classes. Esto está parcialmente resuelto, pero el problema del OP aún permanece. Vota si lo quieres arreglar.

+0

Es bastante fácil evitarlo, así que no estoy seguro de que valga la pena votar. Gracias por el enlace al boleto. –

1

La razón por la que se permite la primera y la segunda no es porque las clases y objetos pueden tener definiciones de reenvío, pero las definiciones no. Entonces, ¿por qué es posible que el compilador mezcle object X con el definido por la clase de caso, no es posible hacerlo en el segundo caso?

Me pregunto qué sucede en el caso Y: ¿el remedo o el objeto complementario no se genera en absoluto?

+0

Espera, ¿qué? :-) ¿Quiso decir "clases y objetos pueden tener definiciones de reenvío, pero ** métodos ** no pueden"? –

+1

@GregorScheidt Ni métodos ni funciones. Bueno, Scala Spec no sabe lo que es un "método", así que también podría llamarlos funciones, pero odio el nombre de confusión en torno a "función". –

Cuestiones relacionadas