Hashtable을 통해 for 루프를 수행하고 각 값에 대해 복제 가능성을 확인하고 가능한 경우 복제하는 방법을 알아야합니다. 이 Hashtable에는 모든 String 키가 있지만 값은 모든 클래스가 될 수 있습니다. 다른 스택 오버플로 페이지에서 다음 Hashmap 예제를 보았습니다.하지만이 작업은 Hashtable로 수행해야합니다. 보다 구체적으로, 괄호가없는 것. (Hashtable<Type, Type>
대신 Hashtable.) 또한 ArrayList를 반복하고 각 요소를 복제하는 예제를 보았습니다. 그러나 해시 테이블을 사용하여이 작업을 수행해야합니다. 아래 두 개의 코드를 게시했습니다. 첫 번째는 찾은 HashMap 예제이고 두 번째는 현재 제안한 내용과 현재 실행중인 문제입니다.지도를 반복하고 각 값을 복제하는 방법은 무엇입니까?
해시 맵
public Map<String,C> deepCopy(Map<String, C> original) {
Map<String, C> copy = new HashMap<String, C>(original.size());
for(Map.Entry<String, C> entry : original.entries()) {
copy.put(entry.getKey(), entry.getValue().clone());
}
}
내 제안
public class _HashtableCloningTest {
public Hashtable deepClone(Hashtable original) {
Hashtable newH = new Hashtable(original.size())
Set<String> keys = original.keySet();
for (String key : keys)
if (original.get(key) instanceof Cloneable)
newH.put(key, original.get(key).clone());
return newH;
}
}
이 코드는 컴파일되지 않습니다. 이 오류는 clone 메서드가 개체 클래스에 있고 해당 클래스의 메서드가 보호되어 있다고 말합니다. 나는 현재 값의 클래스를 복제 할 필요가 있지만 프로그래머는 클래스를 모르기 때문에 적절한 클래스로 캐스팅하는 방법을 모른다.
이 장애물에 대한 통찰력과 도움을 주시면 대단히 감사하겠습니다.
왜 임의의 개체를 복제하고 있습니까? 이것은 일반적으로 IME라는 코드 냄새입니다. –
내 고객이 원하는 방식입니다. 더 나은 방법이있을 수 있다는 것을 알고 있지만이 방법을 알아야합니다. 나는 최선의 해결책이 아니라 할지라도 가능하다고 들었다. – user1567060
코드에 문제가있는 것은
Cloneable
이 올바르게 구현하기가 매우 어렵다는 것입니다. 많은 사람들이 당신을 복제하는 신뢰할 수있는 방법이 아닙니다. http://stackoverflow.com/questions/4081858/about-java-cloneable 문제를 해결하려면이지도에 어떤 유형의 인스턴스를 넣고 올바르게 캐스팅해야 하는지를 알아야합니다. –