Classe Scala étendant le produit avec Serializable
Je suis en train d'apprendre scala et essayé formulaire suivant Scala livre de cuisine:
trait Animal
trait FurryAnimal extends Animal
case class Dog(name:String) extends Animal
case class Cat(name:String) extends Animal
Maintenant, quand je n'ai suivantes :
val x = Array(Dog("Fido"),Cat("Felix"))
il montrer le résultat :
x:Array[Product with Serializable with Animal] = Array(Dog(Fido),Cat(Felix))
Même si je sais qu'une classe de cas de mélange avec des Produits de trait
Ce que je ne suis pas arriver est : Product with Serializable with Animal
Selon ma compréhension du Produit a quelque chose à voir avec le Pattern matching
J'ai fait google, mais n'en est rien.S'il vous plaît Aider pour me le concept en détail.
Grâce
source d'informationauteur optional
Vous devez vous connecter pour publier un commentaire.
Ce comportement est attendu en raison de la façon dont
case class
œuvres.case class
automatiquementextends
deux traits, à savoirProduct
etSerializable
.Product
trait est prolongé decase class
est un algébrique de type de données avec type de produit.Serializable
trait est élargie de manière à ce quecase class
peut être traitée comme une pure data - je.e capable d'être sérialisé.Contrairement à
case class
Dog
etCat
votre traitAnimal
ne s'étend pasProduct
ouSerializable
. D'où la signature d'un type de vous voir.Lorsque vous déclarez quelque chose comme
Array(Dog(""), Cat(""))
scalac besoins en déduire unique type top que peut représenter tous les éléments d'un tableau donné.C'est pourquoi le type inféré est
Product with Serializable with Animal
commeAnimal
ne s'étend pasProduct
niSerializable
tandis que lecase class
n'a implicitement.Pour contourner cette inférence, vous pouvez soit faire de type explicite par
Animal
ou faireAnimal
étendreProduct
etSerializable
.Toutes les classes de cas en Scala possède quelques propriétés:
Product
trait et un défaut de mise en œuvre seront fournis pour eux, car ils peuvent être considérés comme un Produit Cartésien de N enregistrements.Serializable
comme ils sont sérialisables hors de la boîte (comme un choix de conception).hashCode
etequals
fourni par le compilateur, qui aide avec le pattern matchingapply
etunapply
méthodes, de la composition et de la décomposition du type.Cas, les classes sont également Scala, à la façon d'exprimer une Algébrique De Type De Donnéesplus précisément un Type De Produit. Les Tuples sont également un type de produitet comme ils s'étendent également la
Product
trait.Lorsque vous utilisez deux cas, les classes ayant un trait commun, la scala, le compilateur va utiliser l'algorithme d'inférence de types pour tenter de trouver la meilleure correspondance entre la résolution de la
Array
.Si vous voulez éviter de voir cette mise en œuvre de détails, vous pouvez avoir votre trait étendre explicitement ces traits de caractère:
Tous les cas, les classes d'étendre automatiquement
Product
etSerializable
. Il semble laid ? oui.Fondamentalement ,
Product
peuvent être considérés comme des collections hétérogènes. Toutes les catégories de Produits, à savoir. (Produit1 , Produit2 ...) s'étendProduct
qui contient quelques méthodes à utiliser commeproductArity
,productElement
etc.Comme des classes de Cas d'autres types qui s'étend
Product
sontList
,Tuple
etcDe mon scala feuille de calcul,
Pour plus de détails regardez ici.