84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
拥有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>