2012-02-12 24 views
15

Tôi đang cố tạo một bản sao nông của một HashSet các điểm gọi là myHash. Hiện tại, tôi có các thông tin sau:Làm thế nào để tránh cảnh báo cast không được kiểm soát khi nhân bản một HashSet?

HashSet<Point> myNewHash = (HashSet<Point>) myHash.clone(); 

Mã này cho tôi cảnh báo diễn viên không được chọn. Có cách nào tốt hơn để làm điều này?

+0

http://www.velocityreviews.com/forums/t153068-clones-generics-and-unchecked-cast-warnings .html – Borealid

Trả lời

34

Bạn có thể thử này:

HashSet<Point> myNewHash = new HashSet<Point>(myHash); 
+3

+1 - đây là giải pháp tốt hơn. clone() là một ý tưởng tồi. – duffymo

+1

@TedHopp: Hoàn hảo. Cảm ơn bạn. – Tim

+0

nhưng mã này bằng 'addAll (myHash)', vì vậy nó lặp qua bộ sưu tập và thêm mọi phần tử bằng tay, trong khi 'clone()' thực hiện giải trí nhanh hơn của Bản đồ cơ bản bằng cách sử dụng phương thức gói-riêng 'putMapEntries() '... * thở dài * đó là lý do tại sao tôi đã viết HashMap/HashSet tuổi của riêng mình trước đây, và đó chính xác là lý do tại sao rất nhiều thay thế Bộ sưu tập tồn tại đến ngày ... – vaxquis

3

Một câu trả lời khác nhau cho thấy sử dụng new HashSet<Point>(myHash). Tuy nhiên, mục đích của clone() là để có được một đối tượng mới cùng loại. Nếu myHash là một thể hiện của một lớp con của HashSet, mọi hành vi bổ sung được thêm vào bởi phân lớp phụ sẽ bị mất bằng cách sử dụng new HashSet<Point>(myHash).

Cảnh báo truyền không được chọn chỉ là cảnh báo. Có nhiều tình huống trong đó dàn diễn viên được an toàn, nhưng trình biên dịch không đủ thông minh để xác định rằng nó an toàn. Bạn có thể, tuy nhiên, cô lập các cảnh báo vào một phương pháp duy nhất có thể được chú thích với @SuppressWarnings("unchecked"):

@SuppressWarnings("unchecked") 
static <T implements Cloneable> clone(T o) { return (T)(o.clone()); } 
Các vấn đề liên quan