2013-03-19 37 views
5

Tôi có một phương pháp:Java Generics cảnh báo trên java.util.Collections

public List<Stuff> sortStuff(List<Stuff> toSort) { 
    java.util.Collections.sort(toSort); 

    return toSort; 
} 

này tạo ra một cảnh báo:

Type safety: Unchecked invocation sort(List<Stuff>) of the generic method sort(List<T>) of type Collections. 

Eclipse nói cách duy nhất để sửa chữa các cảnh báo là thêm @SuppressWarnings("unchecked") để phương pháp sortStuff của tôi. Điều đó có vẻ giống như một cách ngu ngốc để làm với một cái gì đó được xây dựng vào Java chính nó.

Đây có phải là lựa chọn duy nhất của tôi ở đây không? Tại sao hay tại sao không? Cảm ơn trước!

+11

Phương thức 'void' của bạn trả về' Danh sách'? – Reimeus

+2

Thật buồn vì vậy nhiều người nhận xét về một lỗi rõ ràng là do viết câu hỏi cho SO thay vì trả lời câu hỏi thực. – Sulthan

+0

Chắc chắn, nhưng nó có thể là một dấu hiệu cho thấy đây là thực tế không phải là mã thực sự chạy và sản xuất lỗi, do đó, thanh toán bù trừ nó sẽ rất hữu ích. – NilsH

Trả lời

25

Collections.sort(List<T>) hy vọng rằng T phải triển khai Comparable<? super T>. Có vẻ như Stuff thực hiện Comparable nhưng không cung cấp đối số loại chung.

Hãy chắc chắn rằng tuyên bố này:

public class Stuff implements Comparable<Stuff> 

Thay vì điều này:

public class Stuff implements Comparable 
+2

Vâng đó sẽ là một lỗi, phải không? –

0

Bạn sẽ cần phải thay đổi kiểu trả về của phương pháp của bạn

0

Sorting Generic Collections

Có hai hàm phân loại được định nghĩa trong lớp này, được hiển thị bên dưới:

public static <T extends Comparable<? super T>> void sort(List<T> list); 

public static <T> void sort(List<T> list, Comparator<? super T> c); 

Không một trong số này là chính xác dễ dàng trên mắt và cả hai đều bao gồm toán tử ký tự đại diện (?) Trong định nghĩa của chúng. Phiên bản đầu tiên chỉ chấp nhận một List nếu T mở rộng Comparable trực tiếp hoặc một instantiation chung của Comparable có T hoặc một superclass như một tham số chung. Phiên bản thứ hai có một List và một Comparator được khởi tạo với T hoặc supertype.

3

Đừng tou sử dụng này:

// Bad Code 
public class Stuff implements Comparable{ 

    @Override 
    public int compareTo(Object o) { 
     // TODO 
     return ... 
    } 

} 

hoặc này?

// GoodCode 
public class Stuff implements Comparable<Stuff>{ 

    @Override 
    public int compareTo(Stuff o) { 
     // TODO 
     return ... 
    } 

} 
+0

Tốt để xem nhanh, cách thực hiện so sánh chung. –