私が持っているArrayList<String>
、私はのコピーを返すのが好きだろうと。 ArrayList
次のシグネチャを持つクローンメソッドがあります。
public Object clone()
このメソッドを呼び出した後、返されたオブジェクトをどのようにキャストしArrayList<String>
ますか?
私が持っているArrayList<String>
、私はのコピーを返すのが好きだろうと。 ArrayList
次のシグネチャを持つクローンメソッドがあります。
public Object clone()
このメソッドを呼び出した後、返されたオブジェクトをどのようにキャストしArrayList<String>
ますか?
回答:
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
たほうがよいです。
List<String>
代わりに使用しますArrayList<String>
。これは、ほとんどの場合コレクションを使用する方法です。
なぜクローンを作成するのですか?通常、新しいリストを作成する方が理にかなっています。
List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);
仕事が終わりました。
ArrayList(Collection<? extends E> c)
、引数として使用するリストの種類が問題ではないことを意味します。
これは私がそのために使用するコードです:
ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);
希望はあなたにとって便利です
ArrayList
使用する代わりにArrayList<YourObject>
ArrayList
コンストラクタのコピーオーバーロードを使用しないのですか?
Java 8では、ストリームを使用してクローンを作成できます。
import static java.util.stream.Collectors.toList;
...
List<AnObject> clone = myList.stream().collect(toList());
toCollection
より良い選択かもしれません。
Object.clone()にはいくつかの大きな問題があり、ほとんどの場合、その使用はお勧めできません。完全な回答については、Joshua Blochによる「Effective Java」の項目11を参照してください。プリミティブ型の配列でObject.clone()を安全に使用できると思いますが、それとは別に、クローンの適切な使用とオーバーライドについて慎重に考える必要があります。おそらく、セマンティクスに従ってオブジェクトを明示的に複製するコピーコンストラクターまたは静的ファクトリーメソッドを定義したほうがよいでしょう。
これは、コレクションAPIを使用してうまくいくはずです。
注:copyメソッドは線形時間で実行されます。
//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
使用するのcopyList.addAll(original);
が良い代替案のようです
int
議論の喜び。古き良きの代わりに、このあいまいな静的メソッドを使用する理由がわかりませんaddAll
。
addAllを使用すると問題なく動作することがわかりました。
ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);
ジェネリック構文ではなく括弧が使用されます
new ArrayList<String>(original)
ですか?
汎用インターフェースを複製するにjava.util.List
は、キャストする必要があります。ここにあなたは例です:
List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());
これは少しトリッキーですが、List
インターフェースを返すように制限されている場合は機能します。そのため、リストを実装した後の誰でも、いつでも好きなときに実装できます。
私はこの答えが最終的な答えに近いことを知っていますが、私の答えはあなたがList
-一般的な親-で作業しているときにそれをすべて行う方法に答えますArrayList
私は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);
}
}
List
実装クラスに引数なしのパブリックコンストラクターがあることは保証されません。例えば、List
sのリターンによってArray.asList
、List.of
またはList.subList
おそらくにはありません。