169

ArrayList<String>コピーを返したい があります 。ArrayList次のシグネチャを持つ clone メソッドがあります。

public Object clone()

このメソッドを呼び出した後、返されたオブジェクトを にキャストするにはどうすればよいArrayList<String>ですか?

4

14 に答える 14

339

なぜクローンを作成したいのですか?通常、新しいリストを作成する方が理にかなっています。

List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);

ジョブ完了。

于 2008-09-11T12:10:33.567 に答える
63
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
于 2008-09-10T18:13:19.663 に答える
19

これは私がそのために使用するコードです:

ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);

希望はあなたに役立ちます

于 2012-04-20T18:38:56.303 に答える
18

Java 8 では、ストリームで複製できます。

import static java.util.stream.Collectors.toList;

...

List<AnObject> clone = myList.stream().collect(toList());
于 2016-01-26T13:01:38.390 に答える
17

Object.clone() にはいくつかの重大な問題があり、ほとんどの場合、その使用はお勧めできません。完全な回答については、Joshua Bloch による「 Effective Java 」の項目 11 を参照してください。プリミティブ型の配列で Object.clone() を安全に使用できると思いますが、それとは別に、clone を適切に使用してオーバーライドすることについて慎重に考える必要があります。おそらく、セマンティクスに従ってオブジェクトを明示的に複製するコピー コンストラクターまたは静的ファクトリ メソッドを定義する方がよいでしょう。

于 2008-12-08T17:54:29.490 に答える
15

Collections API を使用すると、これでうまくいくと思います。

: copy メソッドは線形時間で実行されます。

//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
于 2008-09-10T19:48:59.777 に答える
10

addAll を使用すると問題なく動作することがわかりました。

ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);

総称構文ではなく括弧が使用されています

于 2008-09-10T18:15:56.800 に答える
2

これも機能するはずです:

ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()
于 2008-09-10T18:17:37.967 に答える
1

私はJavaの専門家ではありませんが、同じ問題があり、この方法で解決しようとしました。(Tにコピーコンストラクターがあると仮定します)。

 public static <T extends Object> List<T> clone(List<T> list) {
      try {
           List<T> c = list.getClass().newInstance();
           for(T t: list) {
             T copy = (T) t.getClass().getDeclaredConstructor(t.getclass()).newInstance(t);
             c.add(copy);
           }
           return c;
      } catch(Exception e) {
           throw new RuntimeException("List cloning unsupported",e);
      }
}
于 2012-01-23T12:19:06.727 に答える
1
ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();
于 2008-09-10T18:13:17.183 に答える