J'ai une classe de cas (nommez-le Stuff
) que je veux être en mesure de créer des sous-classes anonymes de lors de l'exécution en étendant un trait (appelez-le Marker
). Voici un extrait d'une session de REPL qui illustre ce que je suis en train de faire:L'utilisation du constructeur est-elle autorisée avec les classes de cas?
scala> trait Marker
defined trait Marker
scala> case class Stuff(i: Int)
defined class Stuff
scala> val a = Stuff(1)
a: Stuff = Stuff(1)
scala> val b = new Stuff(1) with Marker
b: Stuff with Marker = Stuff(1)
Notez comment a
instancié à l'aide Stuff.apply()
, alors que dans b
« s cas j'appelle la classe affaire » constructeur.
Ma question est: est l'instanciation des classes de cas en utilisant un constructeur kasher? Il me semble que c'est, puisque les commodités habituelles fournies par les classes de cas, tels que ==
, .equals()
, et .hashCode()
, tout le travail. Ai-je manqué quelque chose qui pourrait marquer ce que je fais un Bad Thing (TM)?
scala> a == b
res0: Boolean = true
scala> a.equals(b)
res1: Boolean = true
scala> a.hashCode == b.hashCode
res2: Boolean = true
Le seul problème mineur potentiel que je vois là est avec la correspondance de modèle. 'b' ci-dessus ne correspondra pas à Stuff (_), mais' val c: Stuff = new Stuff (1) avec Marker' correspondra très bien. –
Il ne correspond pas, voir la mise à jour. –
Je pense que @Max voulait dire ceci: http://paste.pocoo.org/show/266270/ – missingfaktor