나는이 ArrayList<String>
내가 사본을 반환하고 싶습니다있다. ArrayList
다음 서명이있는 복제 방법이 있습니다.
public Object clone()
이 메서드를 호출 한 후 반환 된 Object를 ArrayList<String>
어떻게 다시 캐스팅 합니까?
나는이 ArrayList<String>
내가 사본을 반환하고 싶습니다있다. ArrayList
다음 서명이있는 복제 방법이 있습니다.
public Object clone()
이 메서드를 호출 한 후 반환 된 Object를 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 ()을 안전하게 사용할 수 있다고 생각하지만 클론을 올바르게 사용하고 재정의하는 것에 대해서는 신중해야합니다. 의미에 따라 객체를 명시 적으로 복제하는 복사 생성자 또는 정적 팩토리 메소드를 정의하는 것이 좋습니다.
이것이 Collections API를 사용하여 트릭을 수행해야한다고 생각합니다.
참고 : 복사 방법은 선형 시간으로 실행됩니다.
//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
나는 자바 전문가가 아니지만 같은 문제가 있으며이 방법으로 해결하려고했습니다. (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
반환에 의해이야 Array.asList
, List.of
또는 List.subList
아마하지 않습니다.