使用類似Comparable
這樣的接口作爲方法參數不會使您的類變爲泛型,而是聲明和使用泛型類型參數是您如何使其泛型。
快速正骯髒的答案:由於你正在使用Comparable
,這是一個通用的接口,作爲一個原始類型,而不是給它一個特定類型的參數,如Comparable<String>
收到警告。
爲了解決這個問題,使add()
一般通過指定類型參數:
<T extends Comparable<? super T>> add(T obj) { ... }
但這種速戰速決不會解決你的類是不安全的一般問題。畢竟,不應該列表中的所有對象都是同一類型的?這個add
方法可以讓你將不同的類型放入同一個列表中。當您嘗試比較不同類型的數據時(如何將compareTo
Object
實例與Number
實例或String實例進行比較)會發生什麼?你可以依賴類的用戶來做正確的事情,並確保他們只在你的列表中保留一種東西,但是一個通用的類會讓編譯器執行這個規則。
更好的方法:正確的解決方法是,你的排序列表類應該可能是通用的整體,就像在java.util
其他集合類。
你可能會喜歡這樣的:
public class SortedList<T extends Comparable<? super T>>
implements Iterable<T> {
...
public void add(T item) { ... }
public Iterator<T> iterator() { ... }
...
}
注意,當類是通用的,在add
方法使用的類的形式類型參數,而不是宣稱自己的形式類型參數。
應該有很多教程關於如何創建一個泛型類在網絡上,但這裏有一個簡單的例子:
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; }
}
應該是`T延伸可比 super T>`。 – ColinD 2011-01-28 16:24:36