4

セットを配列に変換しようとしています。

Set<String> s = new HashSet<String>(Arrays.asList("mango","guava","apple"));
String[] a = s.toArray(new String[0]);
for(String x:a)
      System.out.println(x);

そして、それはうまくいきます。new String[0]しかし、私はinの意味を理解していませんString[] a = s.toArray(new String[0]);

最初は試しString[] a = c.toArray();ていたのですが、うまくいきません。の必要性はなぜですかnew String[0]

4

2 に答える 2

10

それが十分に大きい場合、これは Set の要素が格納される配列です。それ以外の場合は、同じ実行時型の新しい配列がこの目的のために割り当てられます。

Object[] toArray()Object[]は、キャストできない、String[]または他の型の配列を返します。

T[] toArray(T[] a)は、このセットのすべての要素を含む配列を返します。返される配列の実行時型は、指定された配列のものです。セットが指定された配列に収まる場合は、そこに返されます。それ以外の場合は、指定された配列の実行時の型とこのセットのサイズで新しい配列が割り当てられます。

実装コードを確認すると ( OpenJDKからコードを投稿しています)、次のことが明確になります。

 public <T> T[] toArray(T[] a) {
     if (a.length < size)
     // Make a new array of a's runtime type, but my contents:
     return (T[]) Arrays.copyOf(elementData, size, a.getClass());
     System.arraycopy(elementData, 0, a, 0, size);
     if (a.length > size)
         a[size] = null;
    return a;
 }
于 2013-05-09T10:28:48.567 に答える
5

このパラメーターは、Java ジェネリック システムにおける多くのよく知られた制限の 1 つの結果です。基本的に、正しいタイプの配列を返すことができるようにするために、パラメーターが必要です。

于 2013-05-09T10:32:48.587 に答える