2017-09-20 128 views
-2

我有一個List<? extends Serializable>其中包含一個Integer列表,我希望它被排序。我不能在這裏使用Collection.sort()。有一個例外說什麼是排序序列化列表的理想方式Java

推斷的類型捕獲#2的?擴展序列化是不是一個有效 替代有界參數>

什麼是理想的方式?

+2

按照什麼排序? – Kayaman

+2

排序的條件是什麼? 'Serializable'不提供關於比較或排序順序的任何信息。 – dpr

+1

**爲什麼**不能使用'Collections.sort()'? – slim

回答

2
List<? extends Serializable> list = Arrays.<Integer> asList(2, 3); 

在這裏,我們要創建一個List<Integer>但我們扔掉編譯器的知識要素是Integer。所有編譯器都知道list是它包含Serializable類型的元素。

Collections.sort(list); 

...不會編譯。沒有方法稱爲Collections.sort(),它接受list所具有的任何類型的單個元素。有Collections.sort(List<? extends Comparable>),但我們的list不適合這個。我們可以使用Collections.sort(List<T> list, Comparator<? super T> c) - 我們只需要提供Comparator<? extends Serializable>

這就是問題所在。沒有什麼關於Serializable有意義的比較。所有你能做的就是一個不安全的轉換:

Collections.sort(list, Comparator.comparing(x -> (Integer) x)); 

你知道這會工作,因爲你已經安排那list實際上包含Integer - 但鑄像,這是一個代碼味道。如果你的班級需要輸入Integer的列表,然後通過List<Integer>

Collections.sort(list, Comparator.comparing(x -> (Comparable) x)); 

...也有效,但有相同的氣味。

+0

那麼,你可以通過簡單地說'Collections.sort(list,null)'或'list.sort(null)'來完全繞過檢查,即使編譯時類型不知道。 – Holger

相關問題