È davvero facile utilizzare accidentalmente una classe di case no-arg in modo errato come un modello.
scala> case class Foo
warning: there were deprecation warnings; re-run with -deprecation for details
defined class Foo
scala> (new Foo: Any) match { case Foo => true; case _ => false }
res10: Boolean = false
Invece di:
scala> (new Foo: Any) match { case _: Foo => true; case _ => false }
res11: Boolean = true
O meglio:
scala> case object Bar
defined module Bar
scala> (Bar: Any) match { case Bar => true; case _ => false }
res12: Boolean = true
UPDATE Speriamo che la trascrizione di seguito sarà dimostrare perché un elenco di parametri vuoto si preferisce l'elenco dei parametri mancante deprecato.
scala> case class Foo() // Using an empty parameter list rather than zero parameter lists.
defined class Foo
scala> Foo // Access the companion object Foo
res0: Foo.type = <function0>
scala> Foo() // Call Foo.apply() to construct an instance of class Foo
res1: Foo = Foo()
scala> case class Bar
warning: there were deprecation warnings; re-run with -deprecation for details
defined class Bar
scala> Bar // You may expect this to construct a new instance of class Bar, but instead
// it references the companion object Bar
res2: Bar.type = <function0>
scala> Bar() // This calls Bar.apply(), but is not symmetrical with the class definition.
res3: Bar = Bar()
scala> Bar.apply // Another way to call Bar.apply
res4: Bar = Bar()
Un oggetto caso di solito sarebbe ancora preferito su un elenco di parametri vuoto.
Invece di 'caso _: Foo' puoi scrivere' caso Foo() '. – sepp2k
Ancora non capisco. Perché dovrei aspettarmi che il costrutto 'Bar' crei una nuova istanza di classe' Bar'? – missingfaktor
** "Bar() // Questo chiama Bar.apply(), ma non è simmetrico con la definizione della classe." ** - Questo argomento si applica anche alle classi normali (non case). Allora perché il compilatore non mostra avviso quando definisco una classe di questo tipo senza lista parametri? (ad esempio, 'class Bar') – missingfaktor