2016-06-28 27 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。

相關問題