2017-02-05 4 views
1

*スカラー配列には同じ型のデータが含まれていることがわかっています。しかし、私が配列を宣言したときに、異なるデータ型を持つScala配列

var a = new Array[Any](3) 

私は異なるデータ型を保存することができます。

a(0)=5 
a(1)="hello" 
a(2)=1.5 

どのようにできますか?それが間違っている場合、異なるデータ型を格納するスカラーのオプションは何ですか?*

+1

私はこれに対する適切な答えが広すぎると思います。多くのScalaチュートリアルの1つを参照してください。 –

+0

あなたの質問は、値が単一の一意のタイプしか持たないと考えることを示唆しています。しかし、サブタイプを持つ言語では、値は一度に多くの型のメンバーになる可能性があります。 –

答えて

3

「同じ型」という概念は、一般性のレベルによって決まります。 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; 

を定義する場合は、DogFrogが同じ型を持っているのですか?我々が書く場合

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を入れても問題ありません。

1

はい、あなたは約scala arrayであり、実際にはsame typeというデータがここに格納されています。この例を参照してください:

scala> val a = Array(5,"hello",1.5) 
a: Array[Any] = Array(5, hello, 1.5) 

我々はintegerstringdoubleを含む配列が作成されていることがわかりません。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) 

あなたは私たちがListArrayの両方にここ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) 
0

それは 異なるデータタイプを格納するために、我々はScalaで持っているオプションが何であるか?*

その後、間違っている場合は最も明白な答えはです。シェープレスは、タイプ情報を失うことなく異種タイプをリストに格納できる、高度なデータ構造HListをサポートしています。

は、例えば以下は、タイプIntStringBooleanの三つの要素を有するタイプ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はデータだけでなく要素の型情報も格納し、検索時に適切にキャストします。

関連する問題