在实现自己的数据结构(需要可比较的类型)时,我总是这样做:
public class ComparableCollection<E extends Comparable<E>> { ... }
显然,这会在编译时强制执行可比较的约束。但是我这几年来一直是学生,却以某种方式忽略了这样一个事实,即强制使用可比类型的集合的Java实现在编译时并没有这样做,而是在运行时抛出了一个ClassCastException
添加元素的错误。例如:
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, ... { ... }
TreeSet
由aNavigableMap
作为后盾,如果Comparator
为null
,则尝试按以下方式投射键:
Comparable<? super K> k = (Comparable<? super K>) key;
现在,如果插入的类型不具有可比性,ClassCastException
则抛出a。
与在编译时强制执行约束相比,此设计的真正好处是什么?
好处是您可以将TreeSet与未实现Comparable
但可以为其提供对象的对象一起使用Comparator
。
有关Comparable a Comparator之间的区别的更多信息,请参见:Java:Comparable与Comparator
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句