私はscalaを初めて使用します(学習を開始したばかりです)が、奇妙なことに気づきました.ArrayクラスとListクラスがあり、どちらにも、、などのメソッド/関数がありますforeach
.forall
しかしmap
、これらのメソッドは継承されませんいくつかの特別なクラス(特性)から。Java の観点から、契約Array
をList
提供する場合、その契約はインターフェイスで宣言し、抽象クラスで部分的に実装する必要があります。scala で各型 (配列とリスト) が独自のメソッドのセットを宣言するのはなぜですか? なぜ彼らはいくつかの共通のタイプを持っていないのですか?
2 に答える
しかし、これらのメソッドのいずれも、いくつかの特別なクラス (特性) から継承されていません。
それは単に真実ではありません。
scaladoc を開いて.map
Array と List のメソッドを検索し、それをクリックすると、定義されている場所が表示されます。
リストの場合:
配列の場合:
TraversableとIterableについての情報も参照してください。どちらも scala コレクションのコントラクトのほとんどを定義しています (ただし、一部のコレクションでは、Traversable/Iterable で定義されたメソッドを効率化のために再実装する場合があります)。
また、一般的なコレクション間の関係(2 つの図までスクロール)を確認することもできます。
ここで om-nom-nom の回答を拡張します。
Scala にはArray
--がなく、 Java Array
であり、JavaArray
はインターフェイスを実装していません。実際、私が間違っていなければ、それは適切なクラスでさえありません。また、バイトコード レベルで特別なメカニズムを介して実装されていることは確かです。
ただし、Scala では、すべてがクラスです。 Int
(Java のint
) はクラスであり、Array
. しかし、実際のクラスが Java に由来するこれらのケースでは、Scala は Java によって提供される型階層によって制限されます。
foreach
、などに戻りますが、これらはJavamap
に存在するメソッドではありません。ただし、Scala では、あるクラスから別のクラスへの暗黙的な変換を追加し、そのメカニズムを通じてメソッドを追加できます。を呼び出すと、実際に行われるのは です。これは、scaladoc のドキュメントでわかるように、クラスに属していることを意味します。arr.foreach(println)
Predef.refArrayOps(arr).foreach(println)
foreach
ArrayOps