web-dev-qa-db-fra.com

Constructeur de surcharge pour les classes de cas de Scala?

Dans Scala 2.8 existe-t-il un moyen de surcharger les constructeurs d'une classe de cas?

Si oui, veuillez mettre un extrait pour expliquer, sinon, veuillez expliquer pourquoi?

96
Felix

La surcharge des constructeurs n'est pas spéciale pour les classes de cas:

case class Foo(bar: Int, baz: Int) {
  def this(bar: Int) = this(bar, 0)
}

new Foo(1, 2)
new Foo(1)

Cependant, vous pouvez également surcharger la méthode apply dans l'objet compagnon, qui est appelée lorsque vous omettez new.

object Foo {
  def apply(bar: Int) = new Foo(bar)
}

Foo(1, 2)
Foo(1)

Dans Scala 2.8, les paramètres nommés et par défaut peuvent souvent être utilisés au lieu de surcharger.

case class Baz(bar: Int, baz: Int = 0)
new Baz(1)
Baz(1)
184
retronym

Vous pouvez définir un constructeur surchargé de la manière habituelle, mais pour l'invoquer, vous devez utiliser le mot-clé "new".

scala> case class A(i: Int) { def this(s: String) = this(s.toInt) }
defined class A

scala> A(1)
res0: A = A(1)

scala> A("2")
<console>:8: error: type mismatch;
 found   : Java.lang.String("2")
 required: Int
       A("2")
         ^

scala> new A("2")
res2: A = A(2)
21
Lukas Rytz