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; }
}
nên được 'T kéo dài tương đương super T>'. – ColinD
Vâng, tôi đã thử nó như trước và nó hoạt động. – 3mpty