3

Java では、配列をリストに変換したいと考えていました。Java が OOP 言語であることを考えると、次のようなことを期待していました。

int[] myArray = { 1, 2, 3 };               // non-working code
List myList = myArray.toList();

arrayしかし、オブジェクトに toList メソッドがなく、私が望んでいたことを行う正しい方法が次のとおりであることがわかったときは驚きました。

int[] myArray = { 1, 2, 3 };               // working Java code
List myList = Arrays.asList(myArray);

最初は an はオブジェクトと見なされていないのかと思っていましたが、onint[]などのメソッドを呼び出すことができたclone()ので、オブジェクトであると確信しています。

Java の設計者は、なぜ最初のアプローチ (OOP の原則と一致するオブジェクトを操作する) ではなく、2 番目のアプローチ (OOP と矛盾する静的メソッド) を使用したのですか?

私は、C++ が 2 番目のアプローチのようなことを行うことに気付きました。これは、C から残った手荷物であると想定しています。しかし、C# にはToList()メソッドがあります。

OOP に向けた進化の行進を保留するだけですArrays.asList()か、それともこのようにする根本的な理論がありましたか?

4

4 に答える 4

3

配列には、期待されるすべての種類のメソッドが含まれているわけではなく、含まれているメソッドは Object から継承されており、通常は役に立ちません。

int[] array = { 1, 2, 3 };
int[] array2 = { 1, 2, 3 };
System.out.println(array.equals(array2)); // prints false
System.out.println(array.hashCode() == array2.hashCode()); // prints false
System.out.println(array.toString()); // prints something like [I@a2634feg

Sun/Oracle にこれを修正してもらいましたが、適切に修正するのは非常に複雑だという噂が返ってきました。

于 2013-06-12T14:57:20.727 に答える
3

int[] はオブジェクトです。

ただし、OOP については、オブジェクトを引数として受け入れるすべてのファクトリ メソッドを提供する必要はありません。

于 2013-06-12T14:56:37.107 に答える
1

変換方法は、期待する場所ではありません。そして、本当の技術的な理由はありません。Scala を見ると (同じ VM を使用し、バイトコードに互換性があります):

object ArrayListDemo {
  def main(args: Array[String]) {
    val list = args.toList
    val array = list.toArray

    println("= List =")
    println(list)
    println(list.mkString(", "))
    println(list.size)
    println(list.length)

    println("= Array =")
    println(array)
    println(array.mkString(", "))
    println(array.size)
    println(array.length)
  }
}

これにより、次の結果が得られます(2つの引数Helloとで呼び出された場合world):

= List =
List(Hello, world)
Hello, world
2
2
= 配列 =
[Ljava.lang.String;@15663a2
Hello, world
2
2

これは実際には「JVM 配列」であり、メソッドが追加されていることがわかります。また、すべてのコレクション タイプ (リッチおよびプリミティブ) には変換メソッドがあります。

そうです、OOP のようには感じられません。「必須」のように感じられます。

于 2013-06-12T15:37:58.353 に答える
1

配列 ( int[]Foo[]) は、最初のバージョン (JDK1.0) から Java に存在していました。データ構造のサポートはほとんどなく、すべて自分で行う必要がありました。Listおよびは V1.2 で導入されました ( ArrayListhttp://docs.oracle.com/javase/6/ocs/api/java/util/List.html )。それが発生したときに言語を変更できなかったか、その時点で言語が複雑すぎた可能性があります。Arrays

私は (Sun の連絡先を通じて) Java の初期の頃をよく観察していました。Java 1.0 はかなり基本的なもので、グラフィックス (AWT 1.02) は最後の瞬間に作成されたことを覚えています。私の記憶では、Java は OO として設計されましたが、当初は範囲が限定されていました (新しいアニメーション言語として宣伝されましたが、Java AWT 1.02 は非常に限定的でした)。その時代の遺物がまだ仕様に残っています。

当時の Java の多大な貢献は WriteOnceRunAnywhere (WORA) (当初は WriteOnceDebugEverywhere!) であり、初期の開発者と保守担当者はそれを第一に考えていたのではないかと思います。Java は C++ から情報を得て、いくつかの構成要素 (例えば、プリミティブとしての int、double - オートボクシングは後からクラッジとして登場) を運びました。C# は (C++ ではなく) Java から開始することができ、ある意味では Java のあり方を修正したものです。すべての言語はいくつかの荷物から始まり、新しい言語はそれぞれいくつかの荷物を取り除きます。

于 2013-06-12T15:00:46.340 に答える