2016-06-28 34 views
2

当实现需要相当的类型我一直在做这样这样我自己的数据结构:在执行类似类型的集合的编译时检查上抛出运行时异常有什么好处?

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

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

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

TreeSetNavigableMap,如果它的Comparatornull,试图投的关键,像这样的支持:

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

现在,如果插入ISN类型不可比拟的ClassCastException被抛出。

这个设计在编译时强制约束的真正好处是什么?

+0

另请参阅http://stackoverflow.com/questions/13890542/creating-a-treeset-with-a-non-comparable-class-why-a-run-time-exception-rather。 'TreeSet'中的元素不需要比较,你可以明确地给出一个比较器。 – Tunaki

+0

@Tunaki,令人惊讶的是,当你走出自己的头时,事物会变得更有意义。这太有道理了。现在有一个时刻。 – ChiefTwoPencils

回答

1

好处是,您可以使用TreeSet的对象不执行Comparable但您可以为其提供Comparator

更多关于可比的比较之间的差异,请参阅:Java : Comparable vs Comparator

+0

请进一步解释一下? – hd1

+0

确实。仅仅因为一个类没有实现“可比”,并不意味着它不需要或不可比。 – ChiefTwoPencils

0

你不能在编译时越来越插入收集哪些对象始终。它更灵活,可以动态定义Collection。

相关问题