当实现我自己需要类似类型的数据结构时,我总是这样做:
public class ComparableCollection<E extends Comparable<E>> { ... }
这显然在编译时强制执行类似的约束。但是我在过去几年里一直是学生,并且忽略了这样一个事实,即强制执行类似类型的集合的Java实现在编译时不会这样做,而是在运行时可能会抛出ClassCastException
而添加元素; e.g:
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, ... { ... }
TreeSet
由NavigableMap
支持,如果Comparator
为null
,则会尝试投射密钥:
Comparable<? super K> k = (Comparable<? super K>) key;
现在,如果插入的类型不具有可比性,则抛出ClassCastException
。
此设计相对于在编译时强制执行约束有什么好处?
答案 0 :(得分:1)
好处是,您可以将TreeSet与不实现Comparable
的对象一起使用,但您可以为其提供Comparator
。
有关Comparable和Comparator之间差异的更多信息,请参阅:Java : Comparable vs Comparator
答案 1 :(得分:0)
您始终无法控制在编译时在Collection中插入的对象。它更灵活,允许动态定义集合。