2014-02-25 72 views
1

我正在嘗試在Java中創建一個自定義列表對象,該參數化類型是在「<>」(如ArrayLists)中。但是,這些參數化類型需要實現Comparable接口(因爲列表將自動排序和組織)。如何使用Comparables在Java中創建自定義參數化列表對象?

我遇到的問題是語法和確保1)列表中的元素是比較的對象,不是任何對象,2) getter方法一樣get(index)應該返回類型的對象的列表而不需要轉換,即如果創建了一個列表參數< Integer >get()應該具有Integer的返回類型,而不是Comparable或Object。

我知道使用諸如< E >< T >之類的東西可以創建Java中的參數化對象,但是這不允許我要求列表中的元素爲Comparable。

順便說一句,如果您有任何評論,如「只使用ArrayList或LinkedList。」或者「你爲什麼使用自定義列表,愚蠢?」,請保留自己。我想創建一個組織良好,效率高的列表系統,它不適合任何現有的結構。可比較的要求是列表自動排序所必需的。

如果有人可以給我一個如何做到這一點的想法,這將不勝感激。

+0

你能告訴我們,您創建 – Kakarot

回答

0

你應該有一個上限的Comparable聲明你的泛型類型參數,以保證項目Comparable。但是,Comparable itself has a type parameter,通常本身。例如。 Integer執行Comparable<Integer>

請問T extends Comparable<T>有效嗎?當然,但如果Superclass implements Comparable<Superclass>,那麼子類Subclass也實現Comparable<Superclass>。考慮到這種可能性,引入一個下界爲T的通配符。

public class CustomParameterizedList<T extends Comparable<? super T>> 

這遵循標準Java現有圖案,如Collections.sort,其類似地定義T

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

Java Generics tutorial has explanations,爲什麼<T extends Comparable<? super T>><T extends Comparable<T>>更加靈活。

T沒有必要與其本身相媲美。所需要的是T與其超類型之一相當。這給我們:

public static <T extends Comparable<? super T>> 
     T max(Collection<T> coll) 
+0

我看到了類的骨架。感謝您的擴展描述。這非常有幫助。考慮到Comparable是一個接口,但是編譯器接受它,我覺得使用關鍵字'extends'而不是'implements'是奇怪的。我想我也可以按照你的建議使用通配符。再次感謝。 – Variadicism

+0

這是Java泛型的一個怪癖,「擴展」在指定上限時適用於類和接口。有關更多詳細信息,請參閱[Java泛型 - 爲什麼「擴展T」允許但不是「實現T」?](http://stackoverflow.com/questions/976441/java-generics-why-is-extends-t-allowed - 丁未器具-T)。 – rgettman

1

比較的對象:

<V extends Comparable<V>>

1

當定義一個類型參數,你可以使用extends關鍵字指定類可能只接受具有一定的超類型(Comparable,你的情況)類型參數。
至於get方法 - 只需使用與返回類型相同的類型參數即可。例如: -

public class MyList<T extends Comparable<T>> { 

    public T get(int index) { 
     ... 
    } 
} 
相關問題