*スカラー配列には同じ型のデータが含まれていることがわかっています。しかし、私が配列を宣言したときに、異なるデータ型を持つScala配列
var a = new Array[Any](3)
私は異なるデータ型を保存することができます。
a(0)=5
a(1)="hello"
a(2)=1.5
どのようにできますか?それが間違っている場合、異なるデータ型を格納するスカラーのオプションは何ですか?*
*スカラー配列には同じ型のデータが含まれていることがわかっています。しかし、私が配列を宣言したときに、異なるデータ型を持つScala配列
var a = new Array[Any](3)
私は異なるデータ型を保存することができます。
a(0)=5
a(1)="hello"
a(2)=1.5
どのようにできますか?それが間違っている場合、異なるデータ型を格納するスカラーのオプションは何ですか?*
「同じ型」という概念は、一般性のレベルによって決まります。 Scalaでは、一般性のレベルは正式な型によって決まります。
3と7 "は同タイプですか?"我々が書くのであれば...
val a : Int = 3
val b : Int = 7
Int
です。しかし、我々は(我々はScalaで行うことは非常に歓迎されている)ビット長の制限Int
タイプを定義した場合、我々は
val a : Int2 = 3
val b : Int3 = 7
を書かないかもしれないと、彼らはもはや、同じタイプであるように見えます!
我々は、継承階層
trait Animal;
class Dog extends Animal;
class Frog extends Animal;
を定義する場合は、Dog
とFrog
が同じ型を持っているのですか?我々が書く場合
val d : Dog = new Dog
val f : Frog = new Frog
答えはいいえのようです。しかし、私たちが書くならば、
val d : Animal = new Dog
val f : Animal = new Frog
のように見えます。同じタイプのようです。私は
val arr : Array[Dog] = Array.ofDim[Dog](5)
ような配列を宣言した場合カエルは犬ではないので、それと一致して、その後私は、それにカエルを置くことはできません。しかし、私は似た配列
val arr : Array[Animal] = Array.ofDim[Animal](5)
を宣言した場合Animal
の一般性のレベルでは、両方のカエルと犬は同じ型を持っているので、その後の進路カエルや犬の両方が、それで行くことができます。
ScalaでAny
は他のすべての型が派生する基本型です。だから、一般性、5
、"hello"
、および1.5
の非常に高いレベルで、すべてがちょうど一般Frog
のハイレベルと、同じタイプAny
を持っているとDog
は同じタイプAnimal
を持っています。したがって、Array[Any]
に5
,"hello"
、1.5
を入れても問題ありません。
はい、あなたは約scala array
であり、実際にはsame type
というデータがここに格納されています。この例を参照してください:
scala> val a = Array(5,"hello",1.5)
a: Array[Any] = Array(5, hello, 1.5)
我々はinteger
、string
とdouble
を含む配列が作成されていることがわかりません。array of Any
が作成されていることがわかります。 array creation
の間に、スカラーコンパイラはがArrayのプロパティを満たすように探しました。hold elements of same type only
です。この場合、すべてのクラスのスーパータイプであるAny
が条件を満たします。また、コンパイラーが共通のスーパータイプを見つけることができない場合、配列の作成は失敗します。それは配列のためだけではない、ということ
注、同じことが.FOR例えばsame types
を保存し、他のcollections
のために行く:異なるデータ型を格納するために、我々はScalaで持っているオプションが何であるかを一覧
scala> val list = List(5,"hello",1.5)
list: List[Any] = List(5, hello, 1.5)
?
あなたは私たちがList
とArray
の両方にここpreserve the type of elements
することができないことを見ることができるように。すべての要素はAny
として保存されています。要素の種類を維持し、それらを一緒に格納するため、ScalaはTuple
を提供してくれます:Array[Any]
は私が質問の下の部分にお答えしましょうなど種類の文字列、論理値、のIntの要素を持つことができ、なぜ他の人が答えたように
scala> val tuple = (5,"hello",1.5)
tuple: (Int, String, Double) = (5,hello,1.5)
それは 異なるデータタイプを格納するために、我々はScalaで持っているオプションが何であるか?*
その後、間違っている場合は最も明白な答えはです。シェープレスは、タイプ情報を失うことなく異種タイプをリストに格納できる、高度なデータ構造HList
をサポートしています。
は、例えば以下は、タイプInt
、String
とBoolean
の三つの要素を有するタイプHList
のヴァルlist
を有する上記のコードで
scala> import shapeless.{::, HList, HNil}
import shapeless.{$colon$colon, HList, HNil}
scala> val list = 1 :: "a" :: true :: HNil
list: shapeless.::[Int,shapeless.::[String,shapeless.::[Boolean,shapeless.HNil]]] = 1 :: a :: true :: HNil
scala> list.head
res0: Int = 1 // notice the type of the element is Int and not Any
scala> list.tail.head
res1: String = a
scala> list.tail.tail.head
res2: Boolean = true
をスニペット参照します。そして、HList
の要素を取得するとき、要素の元の型は保持され、配列の場合と同様にAny
のような汎用型は取得されません。これは可能です。HList
はデータだけでなく要素の型情報も格納し、検索時に適切にキャストします。
私はこれに対する適切な答えが広すぎると思います。多くのScalaチュートリアルの1つを参照してください。 –
あなたの質問は、値が単一の一意のタイプしか持たないと考えることを示唆しています。しかし、サブタイプを持つ言語では、値は一度に多くの型のメンバーになる可能性があります。 –