截图红字的理解基本没错但不完全,正如 @jokester 说的,你没把代码贴全,注意第561行 else 前面的部分。实际上,TreeMap<T>或TreeSet<T>,排序依据有两种情况:
创建时带了Comparator<? super T>,那么排序依据这个Comparator;
创建时不带Comparator<? super T>,那么要求T必须实现Comparable。
所以看TreeSet<Person>的情况,如果创建时带了Comparator<Person>,那么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>
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(2)
截图红字的理解基本没错但不完全,正如 @jokester 说的,你没把代码贴全,注意第561行 else 前面的部分。实际上,TreeMap<T>或TreeSet<T>,排序依据有两种情况:
创建时带了Comparator<? super T>,那么排序依据这个Comparator;
创建时不带Comparator<? super T>,那么要求T必须实现Comparable。
所以看TreeSet<Person>的情况,如果创建时带了Comparator<Person>,那么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>