拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
截圖紅字的理解基本上沒錯但不完全,正如 @jokester 所說的,你沒把程式碼貼全,注意第561行 else 前面的部分。實際上,TreeMap或TreeSet,排序依據有兩種情況:
創作時帶了Comparator super T>,那麼排序依據這個Comparator;
創建時不帶Comparator super T>,那麼要求T必須實作Comparable。
所以看TreeSet的情況,如果建立時帶了Comparator,那麼Person完全可以不實作Comparable。
另外,Integer本身實作了Comparable類型,所有基本類型的封裝物件(還有Long、Double、Boolean等),以及String都,都實作了Comparable,所以當然可以強轉。
最後留一個問題給大家,TreeMap創建時帶Comparator的話,為什麼要指定類型Comparator<? super K>,而不是Comparator<K>或Comparator<? extends K>?參閱TreeMap的一個建構子:
Comparator<? super K>
Comparator<K>
Comparator<? extends K>
public TreeMap(Comparator super K> comparator);
正確
因為 class Integer implements Comparable<Integer>
class Integer implements Comparable<Integer>
截圖紅字的理解基本上沒錯但不完全,正如 @jokester 所說的,你沒把程式碼貼全,注意第561行 else 前面的部分。實際上,TreeMap或TreeSet,排序依據有兩種情況:
創作時帶了Comparator super T>,那麼排序依據這個Comparator;
創建時不帶Comparator super T>,那麼要求T必須實作Comparable。
所以看TreeSet的情況,如果建立時帶了Comparator,那麼Person完全可以不實作Comparable。
另外,Integer本身實作了Comparable類型,所有基本類型的封裝物件(還有Long、Double、Boolean等),以及String都,都實作了Comparable,所以當然可以強轉。
最後留一個問題給大家,TreeMap創建時帶Comparator的話,為什麼要指定類型
Comparator<? super K>
,而不是Comparator<K>
或Comparator<? extends K>
?參閱TreeMap的一個建構子:public TreeMap(Comparator super K> comparator);
正確
因為
class Integer implements Comparable<Integer>