私はscalaを学習しており、Scala Cookbook:
trait Animal
trait FurryAnimal extends Animal
case class Dog(name:String) extends Animal
case class Cat(name:String) extends Animal
今私が次のようにしたとき:
val x = Array(Dog("Fido"),Cat("Felix"))
結果は次のように表示されます。
x:Array[Product with Serializable with Animal] = Array(Dog(Fido),Cat(Felix))
ケースクラスが製品特性と混在していることは知っていますが
私が得ていないのは:Product with Serializable with Animal
私の理解によると、製品はパターンマッチングと関係があります
私はそれをグーグルで調べましたが、何も得られませんでした。コンセプトを詳しく知るために助けてください。
ありがとう
_case class
_の動作方法により、これは予期される動作です。 _case class
_自動的にextends
の2つの特性、つまりProduct
とSerializable
。
Product
特性は、_case class
_が 代数データ型 で 製品型 であるため拡張されます。
Serializable
特性は、_case class
_を純粋なデータとして扱うことができるように拡張されています。つまり、シリアル化が可能です。
_case class
_ Dog
およびCat
とは異なり、特性Animal
はProduct
またはSerializable
を拡張しません。したがって、表示されるタイプシグネチャ。
Array(Dog(""), Cat(""))
のようなものを宣言する場合、scalacは特定の配列のすべての要素を表すことができる単一の top type を推論する必要があります。
Animal
はProduct
もSerializable
を拡張しなかったが、_Product with Serializable with Animal
_は暗黙的に拡張したので、推論された型は_case class
_である。
この推論を回避するには、Animal
でタイプを明示的にするか、Animal
をProduct
とSerializable
に拡張します。
_trait Animal extends Product with Serializable
case class Dog(name: String) extends Animal
case class Cat(name: String) extends Animal
Array(Dog(""), Cat("")) // Array[Animal] = Array(Dog(), Cat())
_
Scala=のすべてのケースクラスには、いくつかのプロパティがあります。
Product
特性を自動的に拡張し、 Nレコードのデカルト積 として表示できるため、デフォルトの実装が提供されます。Serializable
を拡張します(設計上の選択として)そのままシリアル化できるためです。hashCode
とequals
の実装があり、パターンマッチングを支援します。apply
メソッドとunapply
メソッドを提供します。ケースクラスは、Scalaの 代数データ型 、より具体的には 製品型 の表現方法でもあります。 タプルは製品タイプでもあります であるため、Product
特性も拡張します。
共通の特性を持つ2つのケースクラスを使用する場合、scalaのコンパイラはその型推論アルゴリズムを使用して、Array
に最適な解像度を見つけようとします。
この実装の詳細を見ることを避けたい場合は、あなたの特性にそれらの特性を明示的に拡張させることができます:
sealed trait Animal extends Product with Serializable
すべてのケースクラスは、Product
およびSerializable
を自動的に拡張します。見苦しい?はい。基本的に、Product
は異種コレクションとして表示できます。すべての製品クラス。 (Product1、Product2 ...)は、Product
、productArity
などのように使用する一般的なメソッドを含むproductElement
を拡張します。
Caseクラスと同様に、Product
を拡張する他の型はList
、Tuple
などです。
私のscalaワークシートから、
val product : Product = (10,"String",3) //> product : Product = (10,String,3)
product.productArity //> res0: Int = 3
product.productElement(0) //> res1: Any = 10
product.productElement(1) //> res2: Any = String
product.productElement(2) //> res3: Any = 3
case class ProductCase(age:Int,name:String,ISBN:Int)
ProductCase(23,"som",5465473).productArity //> res4: Int = 3
詳細については、 こちら をご覧ください。