2016-12-01 17 views
2

現在、私はScalaを学んでおり、この本を読んでいますScalaでプログラミングしています。「配列やリストとは違って、タプルは異なる型のオブジェクトを保持できます。たとえば、次のタプルにはInt、String、Floatが含まれます。タプルとリストの違いは?Scalaの[Any]?

val tup = (1, "hello", 4.4) 

ここでも、この本は「あなたがリスト/配列の要素の任意の型を持つようにしたい場合は、あなたが任意のデータ型を使用することができます。」と言います

val list = List[Any](1, "hello", 4.4) 

したがって、これらの2つのアプローチの違いは何ですか?互いに何かの利点は何ですか?

+1

タイプ「Any」は、何かが間違っているという良い兆候です。避けてください。 – jwvh

答えて

2

AnyはちょうどIntまたはStringのように、データ型であるが、それらは異なります。
Tuple例えば、異なるデータ型のヴァルスを含めることができる。すなわち、複数のデータ型を保持することができますが、TupleのタイプはTupleであるどのように多くの要素に依存するので、コンテナ、次のとおりです。

val tup = (1, "hello", 4.4) // type of tup here is scala.Tuple3 (Int, String, Double) 
val tup = (2.3, null) // type of tup here is scala.Tuple2 (Double, Null) 
val tup = (5:Any, "hello", 2.2) // type of tup here is scala.Tuple3 (Any, String, Double) 

しかしTupleの各要素のタイプが維持されます。一方Anyは、最初にStringまたはIntまたはNullのタイプである要素の一意の型識別情報がない家庭的なデータ型のようであり、単一のデータ型Anyに変換され、すべての型を失います-情報。

更新:
TupleList[Any]差がTupleがまだ個々の要素のデータ型を維持し、複数のデータ型の要素を保持することができるということです。
List又はArrayのみようList[Any]タイプAnyのすべての要素から構成され、それは基本的にすべての要素(かかわらず、それらの以前のデータ型)に変換します、単一データ型の要素を保持することができるがAny

+0

タプルと 'Any'の間ではなく、タプルと' List [Any] '(または' Array [Any] 'または' Seq [Any] ')との比較です。 –

+0

@AlexeyRomanov、申し訳ありません。私の答えは違いを説明するかもしれませんが、私はそれを編集します。指摘ありがとう:) – Yankee

6

tupは、タイプが(Int, String, Double)であるため、正しいタイプのデータを返すことができます。tup._1のタイプはIntです。 listのタイプはList[Any]なので、タイプ情報はすべて失われています。list(0)のタイプはAnyです。

Any(またはList[Any]など)は使用しないでください。タプルをするときには絶対に使用しないでください。

+0

正確な答えをありがとう。したがって、List [Any]を使用すると、すべてのタイプ情報が失われます。私はAnyをできるだけ少なく使うことを避けます。ありがとうございました。 –

3

タプルはタイプセーフでList [Any]では要素を適切な型にキャストする必要があります。

val tup = (1, "hello", 4.4) 
tup._2 --> gives you string 

val list = List[Any](1, "hello", 4.4) 
list(1) --> gives you object of type Any and you have to cast this object 

あなたのタプルは、タイプがTuple3 [Int、String、Double]のクラスです。

+0

List [Any]は型安全ではないため、使用するとキャスティングのオーバーヘッドが発生します。ご説明をいただき、ありがとうございます。 –

+0

正直なところ、ほとんどの状況では、鋳造のオーバーヘッドが些細なだけでなく、コンパイラによってタプル用に生成されたコード(およびほとんどのジェネリック使用)もキャストされていません。型安全性は唯一の真の関心事ですが、非常に大きなものです。 –

0

私はPawelNで

val list = List[Any](1, "hello", 4.4) 
for (i <- list) println(i.getClass) 

または

val array = Array[Any](1, "hello", 4.4) 
for (i <- array) println(i.getClass) 

結果が同意しない:あなたがリスト内の項目にアクセスしたとき

class java.lang.Integer 
class java.lang.String 
class java.lang.Double 

したがって、何のキャストは必要ありませんまたはAnyの配列。もちろん、私はそのようなことを使っているコードの設計に疑念があるでしょう。

タプルの主なポイントは、関数が異なるタイプのオブジェクトの任意の数を返すことができることです。これは非常に軽いので、型の安全性を犠牲にして複数の値を返す必要があるたびにクラスを作成します。

関連する問題