2014-10-31 85 views
4

我不知道最佳方式來表達我的問題,但我無法將ArrayList<class_that_implements_comparable>傳遞到與參數不同的類中的方法ArrayList<Comparable>將ArrayList <SomeClass>傳遞給參數ArrayList中的方法<Comparable>

比方說,我有一個司機二班的ArrayList:

ArrayList<Person> peopleList; 
ArrayList<Place> placeList; 

無論是類和廣場類實現可比。

然後,在一類稱爲排序,我有兩種方法:

public static void sort(ArrayList list){ 
    sortList(list); 
} 
public static void sortList(ArrayList<Comparable> list) 
{ 
    //Code here 
} 

有了這個設置,我可以打電話給Sorts.sort(peopleList)和Sorts.sort(placeList)沒有任何問題。它完美的作品。

然而,如果我改變排序方法的簽名有ArrayList<Comparable>參數...

public static void sort(ArrayList<Comparable> list){ 
    sortList(list); 
} 

我碰到下面的錯誤在我的驅動程序類:

Error:(59, 14) java: method sort in class Sorts cannot be applied to given types; 
    required: java.util.ArrayList<java.lang.Comparable> 
    found: java.util.ArrayList<Passenger> 
    reason: actual argument java.util.ArrayList<Passenger> cannot be converted to java.util.ArrayList<java.lang.Comparable> by method invocation conversion 

爲什麼java允許我使用非泛型ArrayList自變量將通用ArrayList<>傳遞給另一個類,然後將該ArrayList傳遞給另一個使用的方法的說法,但它不會讓我通過一個通用的ArrayList<>直接到ArrayList<Comparable>

有沒有一種方法,我可以直接轉換它,而不必使用額外的方法?

非常感謝您的寶貴時間和您可以提供的任何見解!

回答

3

您需要傳遞實現Comparable本身或超類(或超類)的內容。

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

當你的方法有簽名靜態無效排序(ArrayList列表)它只接受ArrayList的實例。

如果Person實現Comparable,那麼並不意味着List<Person>List<Comparable>的子類。所以,你需要一些額外的動作,提高你的方法:

  • 允許實現可比各類T extends Comparable
  • 允許超Comparable<? super T>
+0

謝謝後繼承可比各類!這使得總體感覺和幫助非常大。 – 2014-10-31 06:35:38

+0

然後,這會要求我將>添加到ArrayList傳遞給其他任何方法。有沒有辦法去除這個要求? – 2014-10-31 06:40:17

+0

取決於你的方法。如果他們與你的'sort'方法有相同的想法(接受所有可比對象的列表),那麼你應該。 – 2014-10-31 06:47:38

相關問題