Lorsque vous créez une classe de cas, le compilateur crée un correspondant compagnon objet avec quelques-uns de la classe de cas de goodies: un apply
usine méthode correspondant à la primaire constructeur, equals
, hashCode
, et copy
.
Un peu curieusement, cela a généré objet s'étend au-Fonctionn.
scala> case class A(a: Int)
defined class A
scala> A: (Int => A)
res0: (Int) => A = <function1>
C'est seulement le cas si:
- Il n'est pas défini manuellement compagnon objet
- Il y a exactement un paramètre de la liste
- Il n'y a pas des arguments de type
- Le cas de la classe n'est pas abstraite.
Semble que cela a été ajoutée il y a deux ans. La dernière incarnation est ici.
Personne ne l'utiliser, ou de savoir pourquoi il a été ajouté? Il augmente la taille du bytecode généré un peu statique transitaire méthodes, et dans l' #toString()
méthode de la compagne d'objets:
scala> case class A()
defined class A
scala> A.toString
res12: java.lang.String = <function0>
Mise à JOUR
Manuellement les objets créés avec un seul apply
méthode ne sont pas automatiquement considérés comme des FunctionN
:
object HasApply {
def apply(a: Int) = 1
}
val i = HasApply(1)
// fails
// HasApply: (Int => Int)