Просто используйте метод clone () класса Stack (он реализует Cloneable).
Вот простой тестовый пример с JUnit:
@Test
public void test()
{
Stack<Integer> intStack = new Stack<Integer>();
for(int i = 0; i < 100; i++)
{
intStack.push(i);
}
Stack<Integer> copiedStack = (Stack<Integer>)intStack.clone();
for(int i = 0; i < 100; i++)
{
Assert.assertEquals(intStack.pop(), copiedStack.pop());
}
}
Edit:
tmsimont: это создает для меня предупреждение о «непроверенных или небезопасных операциях». любой
способ сделать это без создания этой проблемы?
Сначала я ответил, что предупреждение будет неизбежным, но на самом деле его можно избежать, используя <?>
(подстановочный знак) -тип:
@Test
public void test()
{
Stack<Integer> intStack = new Stack<Integer>();
for(int i = 0; i < 100; i++)
{
intStack.push(i);
}
//No warning
Stack<?> copiedStack = (Stack<?>)intStack.clone();
for(int i = 0; i < 100; i++)
{
Integer value = (Integer)copiedStack.pop(); //Won't cause a warning, no matter to which type you cast (String, Float...), but will throw ClassCastException at runtime if the type is wrong
Assert.assertEquals(intStack.pop(), value);
}
}
По сути, я бы сказал, что вы все еще делаете непроверенный актерский состав от ?
(неизвестный тип) до Integer
, но предупреждения нет. Лично я все же предпочел бы привести непосредственно к Stack<Integer>
и подавить предупреждение с помощью @SuppressWarnings("unchecked")
.