Chỉ cần sử dụng clone() -method của lớp Stack (nó triển khai Cloneable).
Dưới đây là một thử nghiệm trường hợp đơn giản với 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: Điều này tạo ra một "hoạt động đánh dấu hoặc không an toàn" cảnh báo đối với tôi. Bất kỳ cách nào để thực hiện việc này mà không tạo ra sự cố này?
lúc đầu tôi trả lời rằng cảnh báo sẽ không thể tránh khỏi, nhưng thực sự nó là tránh sử dụng <?>
(wildcard) -typing:
@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);
}
}
Về cơ bản tôi muốn nói rằng bạn vẫn đang làm một diễn viên không được kiểm soát từ ?
(loại không xác định) đến Integer
, nhưng không có cảnh báo. Cá nhân, tôi vẫn muốn truyền trực tiếp vào Stack<Integer>
và ngăn chặn cảnh báo với @SuppressWarnings("unchecked")
.
'Ngăn xếp b = (Stack ) a.clone(); ' –
Marcelo