2016-09-12 9 views
4

Java ArrayとScala Arrayの違いは、Java Arrayはco variantです。スカラ配列はそうではありません。どちらも変更可能です。 Javaでは、sortメソッドはStringやIntの配列など、さまざまな配列を取ることができます。これは、Liskov置換原則の良い例としてよく引用されています。私には良いデザインと思われますか? Scalaでは、Arrayは共変種ではありません。 Scala ArrayはJavaよりも後に設計されています。 Scala Arrayが共分散の面でどのように優れているかはわかりません。多分これはJavaよりも優れているかもしれないというジェネリックを持っていますJava ArrayとScalaの配列

+0

私が正しく理解していれば、あなた自身の質問に答えているようです... –

+0

Scala enrichments 'Array(1,2,3).find(_ == 2)' https://github.com/ lihaoyi/fastparse/issues/126 http://docs.scala-lang.org/overviews/collections/arrays.html –

答えて

10

さらに見てみると、Java言語の父親は後でGenericをにしないと決めました。は共変です。それは良い理由があります。

List<Apple>List<Fruit>ではないためです。そうしないと、あなたは

List<Apple> apples = new ArrayList<>(); 
List<Fruit> fruits = apples; 
fruits.add(new Banana()); 

のようなものを行うことができますが、あなたは

Apple badApple = apples.get(0); 

が安全の呼び出しであることを期待してwouldntは?ここで共分散を許せば、そうではありません!

そして、驚き:これはJava配列が持つ問題です!

したがって、実際にはという問題は、Java配列が共変です!そして、Scala配列が実際にあなたが "分散"を正確に制御できるようにする方が良いでしょう。 Scalaでは、分散を完全に制御できます。 Javaでは常に共変です。

共変配列を持つことは、Javaでジェネリックスを持つと思っていたずっと前に、sort(Object[] objects)のような「汎用」メソッドを可能にする実用的な方法と見なされました。これは過去20年近くです。あなたが見ることができるように、「現代的」なやり方があります。

この決定の "コスト"は、JavaもArrayStoreExceptionを知っているという事実です。 Java配列が共変しないなら、それは必要ではありません!

+1

Scalaジェネリックスはデフォルトでは不変であるが、必要に応じて共変または反変として宣言することもできます例えば、 'scala.collection.Iterrable'は共変です(スカラコレクションは一般に共変な傾向があります - 配列以外の例外があるかどうかわかりません)。分散の安全性は、コンパイラによってチェックされます。 –

+0

質問がJavaのArrayに聞いていましたが、あなたの例はListでした。 – johnsam

+0

一歩前進:「共変配列の何が問題なの?」と尋ねました。私はあなたに**共変動**の "コレクション"の実際の問題を説明しました。言い換えれば、「見て、リストにはこの問題Xがありません」。あなたは本当に私にあなたに言う必要がありますか?それは配列が非常にうまくその問題Xを持っていることを意味しますか? @Cyäeghaのコメントと一緒に、あなたは本当に必要な情報をすべて手に入れました!しかし、そうですね。私は答えを更新しました。 – GhostCat

関連する問題