當實現需要相當的類型我一直在做這樣這樣我自己的數據結構:在執行類似類型的集合的編譯時檢查上拋出運行時異常有什麼好處?
public class ComparableCollection<E extends Comparable<E>> { ... }
這顯然強制在編譯時可比約束。但是我在過去幾年中一直是一名學生,並且忽略了這樣一個事實,即強制執行類似類型的集合的Java實現在編譯時不會這樣做,而是在運行時通過添加元素時可能拋出ClassCastException
;例如:
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, ... { ... }
TreeSet
由NavigableMap
,如果它的Comparator
是null
,試圖投的關鍵,像這樣的支持:
Comparable<? super K> k = (Comparable<? super K>) key;
現在,如果插入ISN類型不可比擬的ClassCastException
被拋出。
這個設計在編譯時強制約束的真正好處是什麼?
另請參閱http://stackoverflow.com/questions/13890542/creating-a-treeset-with-a-non-comparable-class-why-a-run-time-exception-rather。 'TreeSet'中的元素不需要比較,你可以明確地給出一個比較器。 – Tunaki
@Tunaki,令人驚訝的是,當你走出自己的頭時,事物會變得更有意義。這太有道理了。現在有一個時刻。 – ChiefTwoPencils