抛出运行时异常对执行类似类型的集合的编译时间检查有什么好处?

时间:2016-06-28 19:17:34

标签: java data-structures comparable

当实现我自己需要类似类型的数据结构时,我总是这样做:

public class ComparableCollection<E extends Comparable<E>> { ... }

这显然在编译时强制执行类似的约束。但是我在过去几年里一直是学生,并且忽略了这样一个事实,即强制执行类似类型的集合的Java实现在编译时不会这样做,而是在运行时可能会抛出ClassCastException而添加元素; e.g:

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, ... { ... }

TreeSetNavigableMap支持,如果Comparatornull,则会尝试投射密钥:

Comparable<? super K> k = (Comparable<? super K>) key;

现在,如果插入的类型不具有可比性,则抛出ClassCastException

此设计相对于在编译时强制执行约束有什么好处?

2 个答案:

答案 0 :(得分:1)

好处是,您可以将TreeSet与不实现Comparable的对象一起使用,但您可以为其提供Comparator

有关Comparable和Comparator之间差异的更多信息,请参阅:Java : Comparable vs Comparator

答案 1 :(得分:0)

您始终无法控制在编译时在Collection中插入的对象。它更灵活,允许动态定义集合。