2011-01-28 30 views
18

Tôi đang cố gắng triển khai danh sách được sắp xếp dưới dạng một bài tập đơn giản trong Java. Để làm cho nó chung chung tôi có một add(Comparable obj) vì vậy tôi có thể sử dụng nó với bất kỳ lớp nào thực hiện giao diện Comparable.Java "bỏ chọn cuộc gọi đến compareTo (T) là một thành viên của loại thô java.lang.Comparable"

Nhưng, khi tôi sử dụng obj.compareTo(...) ở bất kỳ đâu trong mã tôi nhận được "unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable" từ trình biên dịch (với tùy chọn -Xlint:unchecked). Các mã hoạt động tốt nhưng tôi không thể tìm ra cách để thoát khỏi tin nhắn gây phiền nhiễu đó.

Bất kỳ gợi ý?

Trả lời

22

Về bản chất, cảnh báo này nói rằng Comparable đối tượng không thể so sánh với các đối tượng tùy ý. Comparable<T> là một giao diện chung, trong đó tham số kiểu T chỉ định loại đối tượng mà đối tượng này có thể được so sánh.

Vì vậy, để sử dụng Comparable<T> một cách chính xác, bạn cần phải làm cho danh sách được sắp xếp của bạn chung chung, để diễn tả một hạn chế rằng danh sách của bạn lưu trữ các đối tượng có thể được so sánh với nhau, một cái gì đó như thế này:

public class SortedList<T extends Comparable<? super T>> { 
    public void add(T obj) { ... } 
    ... 
} 
+4

nên được 'T kéo dài tương đương '. – ColinD

+0

Vâng, tôi đã thử nó như trước và nó hoạt động. – 3mpty

1

Bạn cần phải "kiểm tra" hoặc xác định các đối tượng tương đương như vậy:

add(Comparable<Object> obj) 
9

Sử dụng một giao diện như Comparable như một tham số phương thức không làm cho lớp của bạn chung chung, khai báo và sử dụng các tham số kiểu generic là cách bạn làm cho nó chung chung. câu trả lời

Quick-n-bẩn: Bạn đang nhận được cảnh báo bởi vì bạn đang sử dụng Comparable, mà là một giao diện chung, như một loại nguyên liệu, chứ không phải cho nó một đối số loại cụ thể, như Comparable<String>.

Để khắc phục điều này, hãy add() chung bằng cách xác định các tham số kiểu:

<T extends Comparable<? super T>> add(T obj) { ... } 

Nhưng sửa chữa này nhanh chóng sẽ không giải quyết được vấn đề chung mà lớp học của bạn là không an toàn. Sau khi tất cả, không phải tất cả các đối tượng trong danh sách của bạn có cùng loại? Phương thức add này cho phép bạn vẫn có các loại khác nhau trong cùng một danh sách. Điều gì xảy ra khi bạn cố gắng so sánh các loại không đồng nhất (làm cách nào để bạn compareTo một cá thể Object thành một phiên bản Number hoặc cho một cá thể Chuỗi)? Bạn có thể phụ thuộc vào người dùng của lớp để làm điều đúng và đảm bảo họ chỉ dính 1 loại điều trong danh sách của bạn, nhưng một lớp chung sẽ cho phép trình biên dịch thực thi quy tắc này.

Cách tiếp cận tốt hơn: Việc sửa chữa thích hợp là lớp danh sách được sắp xếp của bạn nên được có lẽ là chung chung, giống như các lớp học tập khác trong java.util.

Bạn có lẽ sẽ giống như một cái gì đó như:

public class SortedList<T extends Comparable<? super T>> 
implements Iterable<T> { 
    ... 
    public void add(T item) { ... } 
    public Iterator<T> iterator() { ... } 
    ... 
} 

Lưu ý rằng khi lớp là chung chung, phương pháp add sử dụng các lớp tham số kiểu trang trọng hơn là tuyên bố chính thức tham số kiểu riêng của mình.

Nên có nhiều hướng dẫn trên trang web về cách tạo một lớp chung, nhưng đây là một ví dụ nhanh:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ002

class Pair<X,Y> { 
    private X first; 
    private Y second; 
    public Pair(X a1, Y a2) { 
    first = a1; 
    second = a2; 
    } 
    public X getFirst() { return first; } 
    public Y getSecond() { return second; } 
    public void setFirst(X arg) { first = arg; } 
    public void setSecond(Y arg) { second = arg; } 
} 
Các vấn đề liên quan